文件的下载

来源:互联网 发布:如何成为一个网络写手 编辑:程序博客网 时间:2024/05/22 17:44

超链接下载

<a href="${pageContext.request.contextPath}/File/a.txt">文本文件</a>

如果文件可以直接被浏览器解析,那么会在浏览器中直接打开,不能被浏览器直接解析的,就是下载操作。直接打开的要想下载,右键另存为。

超链接下载,要求下载的资源,必须是可以直接被浏览器直接访问的。(比如我的文件没有放在当前项目下,而是放到了另一个D盘下,浏览器就访问不到我D盘下的文件)

客户端访问服务器静态资源文件时,静态资源文件是通过缺省Servlet返回的,在Tomcat配置文件conf/web.xml中的org.apache.catalina.servlets.DefaultServelt操作的

在服务器端编程完成下载

新建一个jsp,填写代码

<body>    <a href='${pageContext.request.contextPath}/download?filename=a.txt'>txt文件</a>    <a href='${pageContext.request.contextPath}/download?filename=a.jpg'>jpg文件</a>    <a href='${pageContext.request.contextPath}/download?filename=a.mp3'>mp3文件</a></body>

新建一个Servlet,download.java

public class download extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String filename=request.getParameter("filename");        File file=new File("d:/"+filename);        if (file.exists()) {            FileInputStream fis=new FileInputStream(file);//读取要下载文件的内容            OutputStream os=response.getOutputStream();//将要下载的文件内容通过输出流写回到浏览器            int len=0;            byte[] b=new byte[1024*1024];            while((len=fis.read(b))!=-1){                os.write(b,0,len);            }            os.close();            fis.close();        }    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

这样做之后,浏览器也可以访问不在项目下的文件了。

但还是,如果文件可以直接被浏览器解析,那么会在浏览器中直接打开,不能被浏览器直接解析的,就是下载操作。直接打开的要想下载,右键另存为。

设置一个响应头,设置后的效果,就是无论返回的是否可以被浏览器解析,都是下载。

response.setHeader("content-disposition", "attachment;filename="+filename);

文件名乱码问题

如果文件名为中文,下载的时候文件名会为空。

添加代码

String agent=request.getHeader("user-agent");            if (agent.contains("MSIE")) {                //IE                filename=URLEncoder.encode(filename,"utf-8");            }else if (agent.contains("Firefox")) {                //火狐                filename="=?utf-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";            }else{                //其他浏览器                filename=URLEncoder.encode(filename,"utf-8");            }
0 0