下載網絡文件並重命名


一.下載場景

文件下載,通過<a href="url">也是可以的,但是這樣直接下載,一般文件名就是服務器端的沒有任何意義的文件名;

需求:

  1.文件服務器與系統沒有在同一服務器,所以需要使用網絡地址來進行下載;

  2.上傳時為了避免文件重名,使用uuid來生成了文件名,真實的文件名存與數據庫中;

  3.所有的文件都只能下載,不可直接在瀏覽器上打開。

這里使用的springmvc:

 1   @RequestMapping("/download")
 2     public String downloadAmachment(String downloadUrl, String realFileName, HttpServletRequest request,
 3             HttpServletResponse response) {
 4         response.setContentType("text/html;charset=UTF-8");
 5         try {
 6             request.setCharacterEncoding("UTF-8");
 7  
 8             BufferedInputStream bis = null;
 9             BufferedOutputStream bos = null;
10             //此處使用的配置文件里面取出的文件服務器地址,拼湊成完整的文件服務器上的文件路徑
11                         //寫demo時,可以直接寫成http://xxx/xx/xx.txt.這種形式
12                         String downLoadPath = ConfigHelper.getString("img.server.url") + downloadUrl;
13  
14             response.setContentType("application/octet-stream");
15             response.reset();//清除response中的緩存
16             //根據網絡文件地址創建URL
17                         URL url = new URL(downLoadPath);
18                         //獲取此路徑的連接
19                         URLConnection conn = url.openConnection();
20             
21                         Long fileLength = conn.getContentLengthLong();//獲取文件大小
22             //設置reponse響應頭,真實文件名重命名,就是在這里設置,設置編碼
23                         response.setHeader("Content-disposition",
24                     "attachment; filename=" + new String(realFileName.getBytes("utf-8"), "ISO8859-1"));
25             response.setHeader("Content-Length", String.valueOf(fileLength));
26  
27             bis = new BufferedInputStream(conn.getInputStream());//構造讀取流
28             bos = new BufferedOutputStream(response.getOutputStream());//構造輸出流
29             byte[] buff = new byte[1024];
30             int bytesRead;
31             //每次讀取緩存大小的流,寫到輸出流
32                         while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
33                 bos.write(buff, 0, bytesRead);
34             }
35             response.flushBuffer();//將所有的讀取的流返回給客戶端
36             bis.close();
37             bos.close();
38  
39         } catch (IOException e) {
40             LOG.error(e.getMessage(), e);
41             return ErrorPages._500;
42         }
43         return null;
44     }

 

前台頁面可以用一個<a href="/download?downloadUrl=xxxxx&realFileName=yyyy">這里的xxxxx為文件的網絡地址,yyy為文件的真實具有意義的文件名。

這種做法,主要是針對不同服務器上,不能直接通過磁盤盤符例如:D:/xx/xx.txt這種形式來構建File來進行下載。同時,生產系統,文件服務器萬一更改了,到時候還需要直接修改代碼,維護性不高;同時解決文件下載下來,得到的是有具體意義的文件名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM