寫(xiě)在前面
公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出高昌免費(fèi)做網(wǎng)站回饋大家。
談到文件上傳,首先要說(shuō)業(yè)務(wù)邏輯,如果上傳的文件大家都可以看(比如廣告或者首頁(yè)的banner)等,那么我們就把圖片放在靜態(tài)資源區(qū)(與css,js一樣的位置)中,如果文件是受保護(hù)的(像用戶只能查看自己上傳的照片),那么我們就把它存放在服務(wù)器中的某個(gè)專門(mén)存放圖片的位置。
本例分別展示了存放在兩個(gè)位置的上傳文件的方法,上傳之后,作為延伸,還添加了查看上傳的文件以及下載已經(jīng)上傳的文件的功能。
準(zhǔn)備工作
配置SpringMVC,導(dǎo)入commons包
在mvc-servlet.xml中配置文件上傳解析器
<!--文件上傳解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="1000000"/> <property name="defaultEncoding" value="UTF-8" /> </bean>
存放在靜態(tài)資源區(qū)
1、存放位置:
存放在項(xiàng)目中,所以路徑為相對(duì)項(xiàng)目的路徑。
/{yourproject}/webapp/static/img
2、配置響應(yīng)的handler
@Controller public class UploadController { @GetMapping("/upload") public String UploadHandler() { return "upload"; } @PostMapping("/upload/static") public void wriToStatic(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestParam("fileName") MultipartFile file) { if(!file.isEmpty()) { //獲取目標(biāo)文件夾 String path = request.getServletContext().getRealPath("/") + "static/img/"; //獲取用戶上傳的源文件名 String fileName = file.getOriginalFileName(); //新建文件 File file1 = new File(path, fileName); //將文件寫(xiě)入 file.transferTo(file1); redirectAttributes.addFlashAttribute("message","upload to static success"); return "redirect:/upload"; } else { redirectAttributes.addFlashAttribute("message","upload file can not be empty"); return "redirect:/upload"; } } }
存放在服務(wù)器
1、本例存放位置:
存放在服務(wù)器某個(gè)位置,與項(xiàng)目無(wú)關(guān),所以地址為絕對(duì)路徑。
/Users/mac/Desktop/imgtemp/, 為目錄的絕對(duì)路徑。
2、配置響應(yīng)的handler
... @PostMapping("/upload/disk") public String writeToDisk(HttpServletRequest request, @RequestParam("fileName") MultipartFile file, RedirectAttributes redirectAttributes) { if(!file.isEmpty()) { //獲取源文件名 String fileName = file.getOriginalFileName(); //獲取保存文件文件夾路徑 String path = "/Users/mac/Desktop/imgtemp/"; //新建文件 File file1 = new File(path,fileName); //寫(xiě)入文件 file.transferTo(file1); } } ...
延伸部分(文件的查看及下載)
由于響應(yīng)是要以流的形式傳遞文件,我們需要正確的設(shè)置響應(yīng)的MIMIE類型才能被瀏覽器正確的解析,應(yīng)用程序文件的默認(rèn)MIMIE類型為 application/octet-stream,MIME設(shè)置為該值后,瀏覽器不會(huì)自動(dòng)執(zhí)行或詢問(wèn)執(zhí)行這類文件,會(huì)以對(duì)待附件的形式直接將文件下載至本地。
更多關(guān)于MIMIE的解讀請(qǐng)查看這篇文章
如果我們?nèi)绻胱远x下載文件的名字,那么就需要設(shè)置Content-Disposition消息。
Content-Disposition 消息頭指示回復(fù)的內(nèi)容該以何種形式展示,是以內(nèi)聯(lián)的形式(即網(wǎng)頁(yè)或者頁(yè)面的一部分),還是以附件的形式下載并保存到本地。
更過(guò)關(guān)于Content-Disposition的解讀請(qǐng)查看這篇文章
... @GetMapping("/download/byDefault") public void getImgByDefault(@RequestParam String fileName, @RequestParam(required=false,defaultValue="") String saveName), HttpServletResponse response { if(StringUtils.isEmpty(fileName)) { response.sendError(404); return; } //文件存放的路徑 String path = "/Users/mac/Desktop/imgtemp/"; //新建文件 File file = new File(path,fileName); if(!file.exists()) { response.sendError(404); return; } //如果請(qǐng)求參數(shù)saveName不為空,進(jìn)行文件的下載 if(!StringUtils.isEmpty(saveName)) { //設(shè)置響應(yīng)長(zhǎng)度 response.setContentLength((int)file.length()); //設(shè)置響應(yīng)的MIME類型為application/octet-stream response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); saveName = new String(saveName.getBytes("UTF-8"),"ISO8859-1"); //設(shè)置content-disposition為attachment;fileName=saveName response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+saveName+"\""); } //讀取文件 InputStream is = new FileInputStream(file); OutputStream os = response.getOutputStream(); //將文件以流的形式輸出 IOUtils.copy(is,os); os.flush(); os.close(); is.close(); }
我們還可以使用SpringMVC自帶的 ByteArrayHttpMessageConverter 轉(zhuǎn)化器來(lái)將文件輸出,該轉(zhuǎn)換器實(shí)現(xiàn) HttpMessageConverter 接口??勺x取所有MIME的請(qǐng)求信息,響應(yīng)信息的MIME為 application/octet-stream
... @GetMapping("/download/byConvert") public HttpEntity<byte[]> getImgByConvert(@RequestParam String fileName, @RequestParam(required=false,defaultValue="") String saveName) { if(StringUtils.isEmpty(fileName)) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } String path = "/Users/mac/Desktop/imgtemp/"; File file = new File(path,fileName); if(!file.exists()) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } HttpHeaders headers = new HttpHeaders(); if(!StringUtils.isEmpty(saveName)) { headers.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); headers.setContentLength(file.length()); saveName = new Sting(saveName.getBytes("UTF-8"),"ISO8859-1"); headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment;fileName=\"" + saveName + "\""); } else { headers.setContentType(MediaType.IMAGE_PNG); } return new HttpEntity<>(FileCopyUtils.copyToByteArray(file),headers); }
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="/static/bootstrap-3.3.5-dist/css/bootstrap.css" rel="external nofollow" > </head> <body> <div class="container"> <h2 class="text-center">上傳文件撒</h2> <c:if test="${not empty message}"> <h3>${message}</h3> </c:if> <form:form enctype="multipart/form-data" action="/upload/static"> <p class="text-info">上傳至/web/static</p> <label for="">上傳文件:</label> <input type="file" name="uploadFile"> <button class="btn btn-default">提交</button> </form:form> <form:form enctype="multipart/form-data" action="/upload/disk"> <p class="text-info">上傳至Disk</p> <label for="">上傳文件</label> <input type="file" name="uploadFile"> <button class="btn btn-default">提交</button> </form:form> <div class="container"> <button class="btn btn-default"> <a href="/download/byDefault?fileName=dubbo.png" rel="external nofollow" target="_blank">使用默認(rèn)方式查看上傳至Disk的dubbo圖片</a> </button> <button class="btn btn-default"> <a href="/download/byDefault?fileName=dubbo.png&saveName=dubb.png" rel="external nofollow" >使用默認(rèn)方式下載dubbo圖片</a> </button> </div> <div class="container"> <button class="btn btn-default"> <a href="/download/byConvert?fileName=dubbo.png" rel="external nofollow" target="_blank">使用MVC轉(zhuǎn)化器查看上傳至Disk的dubbo圖片</a> </button> <button class="btn btn-default"> <a href="/download/byConvert?fileName=dubbo.png&saveName=dub.png" rel="external nofollow" >使用MVC轉(zhuǎn)化器下載上傳至Disk的dubbo圖片</a> </button> </div> </div> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
標(biāo)題名稱:SpringMVC文件上傳及查看的示例代碼
鏈接地址:http://m.rwnh.cn/article42/jejpec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、搜索引擎優(yōu)化、網(wǎng)站導(dǎo)航、定制開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)