作文件下載功能的時候,通常使用流的形式下載文件,javascript
若是源文件不存在,下載頁面可能就會沒有提示,或者一片空白html
用戶操做以後可能一頭霧水,那如何友好提示呢?前端
想到的有兩種java
1.能夠嘗試下載一個名稱爲:文件不存在.txt 的文檔,裏面還能夠補充說明信息,保證每次能下載到文件,避免沒有響應到用戶的狀況。後端
2.後臺輸出一段JavaScript腳本提示文件不存在或已經被刪除。瀏覽器
直接上代碼app
前端只有給出一個超連接便可ide
<a href="${pageContext.request.contextPath}/receipt/download?fileName=套路得人心.jpg">套路得人心.jpg</a>
後端控制器代碼spa
/** * 下載發票 * @param request * @return */ @RequestMapping(value = "/receipt/download",method = RequestMethod.GET) public void downloadReceipt(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { // 得到要下載的文件的名稱 String fileName = request.getParameter("fileName"); File file = new File(receiptPath + fileName); if(file.exists()){ try { String userAgent = request.getHeader("User-Agent"); if (userAgent.contains("MSIE") || userAgent.contains("Trident")) { //IE瀏覽器處理 fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); } else { // 非IE瀏覽器的處理: fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); } // 以流的形式下載文件。 InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); byte[] buffer = new byte[inputStream.available()]; inputStream.read(buffer); inputStream.close(); // 清空response response.reset(); // 設置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName)); response.addHeader("Content-Length", "" + file.length()); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); outputStream.write(buffer); outputStream.flush(); outputStream.close(); }catch (IOException ex) { log.error("下載文件出錯:" + ex); } }else{ try { response.setContentType("text/html; charset=UTF-8"); //轉碼 PrintWriter out = response.getWriter(); out.flush(); out.println("<script defer='defer' type='text/javascript'>"); out.println("alert('文件不存在或已經被刪除!');"); out.println("window.location='/AnnualStatistics/downloadList';"); out.println("</script>"); } catch (IOException e) { log.error("下載文件出錯:" + e); } } }
效果.net