標籤:分享 read inpu str 寫檔案 路徑 alt last 技術分享
問題描述:
檔案下載功能是web開發中經常使用到的功能,使用HttpServletResponse對象就可以實現檔案的下載。但是下載任務正常進行,下載下來的圖片卻是空
問題代碼:
//從伺服器下載一張圖片 //建立位元組讀取流 從本地讀取圖片 //擷取圖片路徑 ServletContext context = this.getServletContext(); String path= context.getRealPath("WEB-INF/classes/德拉科.jpg"); FileInputStream fis = new FileInputStream(path); //建立位元組輸出資料流 將圖片發送給用戶端 ServletOutputStream sos = response.getOutputStream(); //處理下載檔案名稱 String fileName = path.substring(path.lastIndexOf("\\")+1); //處理檔案名稱中文亂碼問題 String name = URLEncoder.encode(fileName, "utf-8"); //通知瀏覽器以下載的方式開啟檔案 response.setHeader("content-disposition", "attachment;filename="+name); response.setHeader("content-type", "image/jpeg"); //建立字元數組 byte[] arr = new byte[1024]; int len = 0; if((len = fis.read(arr)) != -1) { sos.write(arr, 0, len); } fis.close(); sos.close();
問題分析:
首先,圖片成功儲存到本地,說明通過response設定header進行下載是可行的,那麼,圖片內容為空白只能是讀寫時出現問題仔細檢查,發現在讀寫部分將while寫成了if,導致,寫檔案只在第一次有效,之後無法寫入
問題解決:
將if改為while
//從伺服器下載一張圖片 //建立位元組讀取流 從本地讀取圖片 //擷取圖片路徑 ServletContext context = this.getServletContext(); String path= context.getRealPath("WEB-INF/classes/德拉科.jpg"); FileInputStream fis = new FileInputStream(path); //建立位元組輸出資料流 將圖片發送給用戶端 ServletOutputStream sos = response.getOutputStream(); //處理下載檔案名稱 String fileName = path.substring(path.lastIndexOf("\\")+1); //處理檔案名稱中文亂碼問題 String name = URLEncoder.encode(fileName, "utf-8"); //通知瀏覽器以下載的方式開啟檔案 response.setHeader("content-disposition", "attachment;filename="+name); response.setHeader("content-type", "image/jpeg"); //建立字元數組 byte[] arr = new byte[1024]; int len = 0; while((len = fis.read(arr)) != -1) { sos.write(arr, 0, len); } fis.close(); sos.close();
問題總結:
//處理下載檔案名稱 String fileName = path.substring(path.lastIndexOf("\\")+1); //處理檔案名稱中文亂碼問題 String name = URLEncoder.encode(fileName, "utf-8");
//通知瀏覽器以下載的方式開啟檔案 response.setHeader("content-disposition", "attachment;filename="+name); response.setHeader("content-type", "image/jpeg");
src下檔案的路徑問題
Web工程的根目錄指的是WebRoot/WEB-INF/classes開始的。java的class檔案只能讀到這個目錄的的檔案。如果想讀取其他地方的檔案,可以用絕對路徑。
如果是通過java的class讀檔案,比如“德拉科”.jpg,只能放到WebRoot/WEB-INF/classes目錄下。也就是放到工程src下,會自動編譯到WebRoot/WEB-INF/classes目錄下的
參考連結:http://blog.csdn.net/zhangqindabendan/article/details/53002544
Web 下載圖片為空白