文件的下載和文件的上傳一樣都是Web應(yīng)用中一個(gè)重要的功能點(diǎn)。這篇“SpingMVC的文件下載”是基于以前寫過的那篇“SpringMVC實(shí)現(xiàn)文件上傳”寫的,因此這里就不從頭開始搭建測試項(xiàng)目了,直接接著上次的那個(gè)項(xiàng)目來進(jìn)行測試,因此看這篇文章之前需要簡單瀏覽下上次的那篇文章
創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、高港網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為高港等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。注:SpringMVC實(shí)現(xiàn)文件上傳:http://www.zifangsky.cn/406.html
(1)在UploadController.java這個(gè)controller里的upload方法中添加返回上傳之后的文件的文件名:
modelAndView.addObject("picName", targetFileName);添加之后,這個(gè)方法的完整代碼如下:
@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這個(gè)文件中添加一個(gè)文件下載的超鏈接:
<h3>頭像下載</h3>
<a href="download.html?fileName=${picName}">點(diǎn)擊下載</a>可以看出,這里的fileName就是用的controller中的“picName”來賦值的

注:代碼添加的位置如上圖所示
(3)在UploadController.java中添加一個(gè)用于下載文件的方法,代碼如下:
@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;
}注:從上面的代碼可以看出,通過接收表示文件名的字符串然后跟文件的路徑拼接起來,形成文件在磁盤中真實(shí)路徑的File對象,最后返回文件的流并進(jìn)行下載。需要注意的是,為了防止出現(xiàn)任意文件下載,導(dǎo)致下載到其他路徑中的文件,因此在下載之前校驗(yàn)了文件名的格式。同時(shí)最后返回了一個(gè)ResponseEntity<byte[]>類型的數(shù)據(jù),是為了在返回?cái)?shù)據(jù)流的同時(shí)返回我們自定義的HttpHeaders和HttpStatus
(4)最后下載的效果如下:

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
網(wǎng)站題目:基于SpringMVC的文件下載實(shí)例-創(chuàng)新互聯(lián)
鏈接地址:http://www.chinadenli.net/article0/cccpio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、響應(yīng)式網(wǎng)站、企業(yè)建站、網(wǎng)站營銷、網(wǎng)站建設(shè)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容