java web实现文件下载的注意事项
如图,在浏览器中实现以下的下载方式
注意点:
1,下载文件存在于web服务器上本地上;
2,前端页面用form形式请求。
html:
<div id="download_debit_dlg" > <form id="itemForm_payreslut_charge" method="post"> <table cellspacing="5px;"> <tr> <td><label for="debitDate">日期:</label></td> <td><input type="date" name="debitDate" id="debitDate" required="required"></td> </tr> </table> </form> </div> <div id="dlg-buttons"> <a href="javascript:downloadDebitPost()"iconCls="icon-ok">下载</a> </div>
js:
/** * * 开始下载 * ctx 对应路径 */ function downloadDebitPost(){ var debitDate=$('#debitDate').val(); if (debitDate==""||debitDate==null) { $.messager.alert("系统提示", "请完整输入日期"); return; } $("#itemForm_payreslut_charge").attr("action", ctx + '/downloadDebit'); $('#itemForm_payreslut_charge').submit(); }
java:
@RequestMapping("/downloadDebit") public void downloadDebit(HttpServletRequest request,HttpServletResponse response,@RequestParam Map<String, Object> reqParams) { String debitDate = (String) reqParams.get("debitDate"); debitDate=debitDate.replaceAll("-", ""); try { String fileName = "202210000000000001214_" + debitDate + ".txt";//文件名 String path = "D:/file/opbill/" + fileName;//绝对路径 FileUploadUtil.downLoadByFilePath(request, response,path); } catch (BusinessException e) { //LOGGER.error("导出账单出错:", e); } catch (IOException e) { //LOGGER.error("导出账单出错:", e); e.printStackTrace(); } }
public class FileUploadUtil { /** * 按文件源路径下载文件 * @param request * @param response * @param path */ public static void downLoadByFilePath(HttpServletRequest request, HttpServletResponse response, String path) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("UTF-8"); File file = new File(path); if(!file.exists()){ log.info("文件路径:"+path); throw new BusinessException("下载文件路径不存在["+path+"]"); } long fileLength = file.length(); // 编码处理 String fileName = path.substring(path.lastIndexOf("/") + 1); fileName = encodeFileName(request, fileName); response.setContentType("application/x-msdownload;"); response.setHeader("Content-disposition", "attachment; filename=" + fileName); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(path)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (IOException e) { // 此异常为下载中出现的异常,不影响下载功能,可捕获但无需抛出 } catch (Exception e) { log.error("下载出现异常:", e); } finally { try { if (bis != null) { bis.close(); } if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }