一次文件下載記錄
一次不成熟的文件下載操做記錄,但願能對須要的人有所幫助。前端
1.前端代碼
$("#downloadModel").click(function(){ var modelName = "設備信息導入模板.xls"; window.location.href = commenUrl +"/importAndExport/downloadModel?modelName="+modelName; });
2.控制層接收
1 @RequestMapping(value = "/downloadModel", method = RequestMethod.GET) 2 public void downloadModel(HttpServletRequest request,HttpServletResponse response,String modelName) { 3 try { 4 importAndExportService.downloadModel(modelName,request,response); 5 } catch (Exception e) { 6 e.printStackTrace(); 7 } 8 }
3.實現下載功能
@SuppressWarnings("resource") @Override public void downloadBindModel(String modelName, HttpServletRequest request, HttpServletResponse response) throws Exception { //獲取模板存放的路徑 String path=request.getSession().getServletContext().getRealPath("/")+"/excelTemplate/"; InputStream is=new FileInputStream(new File(path + modelName)); HSSFWorkbook hssfWorkbook=new HSSFWorkbook(is); //下載 DownloadUtil dUtil=new DownloadUtil(); ByteArrayOutputStream os=new ByteArrayOutputStream(); hssfWorkbook.write(os); dUtil.download(os, response, modelName); os.flush(); os.close(); is.close(); }
4.工具類代碼
public class DownloadUtil{ /** * @param filePath 要下載的文件路徑 * @param returnName 返回的文件名 * @param response HttpServletResponse * @param delFlag 是否刪除文件 */ protected void download(String filePath, String returnName, HttpServletResponse response, boolean delFlag){ this.prototypeDownload(new File(filePath), returnName, response, delFlag); } /** * @param file 要下載的文件 * @param returnName 返回的文件名 * @param response HttpServletResponse * @param delFlag 是否刪除文件 */ protected void download(File file,String returnName,HttpServletResponse response,boolean delFlag){ this.prototypeDownload(file, returnName, response, delFlag); } /** * @param file 要下載的文件 * @param returnName 返回的文件名 * @param response HttpServletResponse * @param delFlag 是否刪除文件 */ public void prototypeDownload(File file,String returnName,HttpServletResponse response,boolean delFlag){ // 下載文件 FileInputStream inputStream = null; ServletOutputStream outputStream = null; try { if(!file.exists()) {return;} response.reset(); //設置響應類型 PDF文件爲"application/pdf",WORD文件爲:"application/msword", EXCEL文件爲:"application/vnd.ms-excel"。 response.setContentType("application/octet-stream;charset=utf-8"); //設置響應的文件名稱,並轉換成中文編碼 //returnName = URLEncoder.encode(returnName,"UTF-8"); returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必須和頁面編碼一致,不然亂碼 //attachment做爲附件下載;inline客戶端機器有安裝匹配程序,則直接打開;注意改變配置,清除緩存,不然可能不能看到效果 response.addHeader("Content-Disposition", "attachment;filename="+returnName); //將文件讀入響應流 inputStream = new FileInputStream(file); outputStream = response.getOutputStream(); int length = 1024; int readLength=0; byte buf[] = new byte[1024]; readLength = inputStream.read(buf, 0, length); while (readLength != -1) { outputStream.write(buf, 0, readLength); readLength = inputStream.read(buf, 0, length); } } catch (Exception e) { e.printStackTrace(); } finally { try { outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } //刪除原文件 if(delFlag) { file.delete(); } } } /** * @param byteArrayOutputStream 將文件內容寫入ByteArrayOutputStream * @param response 寫入response * @param returnName 返回的文件名 * @throws IOException */ public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException { response.setContentType("application/octet-stream;charset=utf-8"); returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必須和頁面編碼一致,不然亂碼 response.addHeader("Content-Disposition", "attachment;filename=" + returnName); response.setContentLength(byteArrayOutputStream.size()); ServletOutputStream outputstream = response.getOutputStream(); //取得輸出流 byteArrayOutputStream.writeTo(outputstream); //寫到輸出流 byteArrayOutputStream.close(); //關閉 outputstream.flush(); //刷數據 } }