文件的下載和文件的上傳一樣都是Web應用中一個重要的功能點。這篇“SpingMVC的文件下載”是基于以前寫過的那篇“SpringMVC實現(xiàn)文件上傳”寫的,因此這里就不從頭開始搭建測試項目了,直接接著上次的那個項目來進行測試,因此看這篇文章之前需要簡單瀏覽下上次的那篇文章
創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、高港網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、html5、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為高港等各大城市提供網(wǎng)站開發(fā)制作服務。注:SpringMVC實現(xiàn)文件上傳:http://www.zifangsky.cn/406.html
(1)在UploadController.java這個controller里的upload方法中添加返回上傳之后的文件的文件名:
modelAndView.addObject("picName", targetFileName);
添加之后,這個方法的完整代碼如下:
@RequestMapping(value = "/upload", method = RequestMethod.POST) public ModelAndView upload(User user, @RequestParam("file") MultipartFile tmpFile, HttpServletRequest request) { ModelAndView modelAndView = new ModelAndView("fileupload"); if (tmpFile != null) { // 獲取物理路徑 String targetDirectory = request.getSession().getServletContext().getRealPath("/uploads"); String tmpFileName = tmpFile.getOriginalFilename(); // 上傳的文件名 int dot = tmpFileName.lastIndexOf('.'); String ext = ""; // 文件后綴名 if ((dot > -1) && (dot < (tmpFileName.length() - 1))) { ext = tmpFileName.substring(dot + 1); } // 其他文件格式不處理 if ("png".equalsIgnoreCase(ext) || "jpg".equalsIgnoreCase(ext) || "gif".equalsIgnoreCase(ext)) { // 重命名上傳的文件名 String targetFileName = StringUtile.renameFileName(tmpFileName); // 保存的新文件 File target = new File(targetDirectory, targetFileName); try { // 保存文件 FileUtils.copyInputStreamToFile(tmpFile.getInputStream(), target); } catch (IOException e) { e.printStackTrace(); } User u = new User(); u.setUserName(user.getUserName()); u.setLogoSrc(request.getContextPath() + "/uploads/" + targetFileName); modelAndView.addObject("u", u); modelAndView.addObject("picName", targetFileName); } return modelAndView; } return modelAndView; }
(2)在fileupload.jsp這個文件中添加一個文件下載的超鏈接:
<h3>頭像下載</h3> <a href="download.html?fileName=${picName}">點擊下載</a>
可以看出,這里的fileName就是用的controller中的“picName”來賦值的
注:代碼添加的位置如上圖所示
(3)在UploadController.java中添加一個用于下載文件的方法,代碼如下:
@RequestMapping(value = "/download", method = { RequestMethod.GET, RequestMethod.POST }) public ResponseEntity<byte[]> download(@RequestParam(name = "fileName") String fileName, HttpServletRequest request) { HttpHeaders headers = new HttpHeaders(); Pattern pattern = Pattern.compile("\\w*\\.\\w+"); Matcher matcher = pattern.matcher(fileName); //檢查文件名中非法字符,只允許是字母、數(shù)字和下劃線 if (matcher.matches()) { try { headers.setContentDispositionFormData("myfile", fileName); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 獲取物理路徑 String filePath = request.getSession().getServletContext().getRealPath("/uploads"); File pic = new File(filePath, fileName); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(pic), headers, HttpStatus.CREATED); } catch (Exception e) { e.printStackTrace(); } } return null; }
注:從上面的代碼可以看出,通過接收表示文件名的字符串然后跟文件的路徑拼接起來,形成文件在磁盤中真實路徑的File對象,最后返回文件的流并進行下載。需要注意的是,為了防止出現(xiàn)任意文件下載,導致下載到其他路徑中的文件,因此在下載之前校驗了文件名的格式。同時最后返回了一個ResponseEntity<byte[]>類型的數(shù)據(jù),是為了在返回數(shù)據(jù)流的同時返回我們自定義的HttpHeaders和HttpStatus
(4)最后下載的效果如下:
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
網(wǎng)站題目:基于SpringMVC的文件下載實例-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article0/cccpio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、響應式網(wǎng)站、企業(yè)建站、網(wǎng)站營銷、網(wǎng)站建設、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容