19. JSP - 实现文件下载
文件下载
超链接下载
超链接下载是指,将下载资源作为超链接的链接目的文件出现。若浏览器可以解析该资源文件,则将在浏览器上直接显示文件内容;若浏览器不支持该文件的解析,则会弹出另存为对话框,要求用户保存。
在Web文件夹下创建download文件夹,里面放入一些文件。
创建html:
html这样写:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <a href="dowload/bihu.png">下载图片</a> <!-- 浏览器可以解析的直接打开 --> <a href="dowload/bihu.exe">下载bihu社区</a> </body> </html>
---------------------------------------------------------
jsp这样写:【加个斜杠】
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <a href="${ pageContext.request.contextPath }/dowload/bihu.png">下载图片</a> <!-- 浏览器可以解析的直接打开 --> <a href="${ pageContext.request.contextPath }/dowload/bihu.exe">下载bihu社区</a> </body> </html>
文件路径自己配 你完全也可以用方法 获取文件路径。
目录不要放在eclipse服务器的文件哪里,最好就放在WebContext 文件夹下【和jsp/html 一个目录】,因为每次部署Tomcat时候 会重新部署 那你文件就没了。【意思是叫你下载的文件放在webContext下,或其他,【具体服务器我不知道 反正Eclipse是这样的】】
其实还是那句话: 搞清楚文件路径 实在不行用方法去打印出来查看!
这种方式适用于那种很直接的下载,有点内个了,我们用Servlet进行下载:
先来个JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <a href="${ pageContext.request.contextPath }/dowload">下载bihu.png【Servlet附件下载】</a> </body> </html>
Servlet:
package dowload; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class dowload extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置一下编码 防止各方面的乱码【这里推荐在过滤器写】 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); //设置响应头属性【和浏览器说 这是已文件的形式下载!】 //注意这个格式别写错了 照着拷贝就好了: //response.setHeader("content-disposition", "attachment;filename=文件名字"); /* * 中文的文件名乱码!! 用new String() 解决!!!! 添加头没用的!: * */ String FileName = "壁虎本人图片.png"; FileName = new String(FileName.getBytes("UTF-8"),"iso8859-1"); //利用new String 转换编码!!! 很重要! response.setHeader("content-disposition", "attachment;filename=" + FileName); //获取输入流【在服务器本目录下获取】 //getResourcePaths:获取WebContent中的文件路径 InputStream is = this.getServletContext().getResourceAsStream("/dowload/bihu.png"); //获取输出流 ServletOutputStream out = response.getOutputStream(); //传递文件出去 byte[] bytes = new byte[1024]; int len = -1; while ((len = is.read(bytes)) != -1) { //直接写出去即可! out.write(bytes,0,len); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
解决文件名乱码详解:
用内个什么设置头编码没用的【那个对上传文件的文件名乱码就有用】 因为文件名不是哪里传过来的 我们是往外传 所以:
只需将文件名设置编码即可:
String fileName = "壁虎小时候的照片.png"; fileName = new String(fileName.getBytes("utf-8"),"iso8859-1"); //设置响应头属性值,使文件以附件形式进行下载 response.setHeader("content-disposition", "attachment;filename="+fileName);
完.
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14874233.html