下载的两种方式

1.2.1下载
1、直接建立资源链接的方法
<h1>超链接方式</h1>
<a href="mm.jpg">美女.jpg</a><br/>
<a href="1.zip">美女帅哥.zip</a>
该方式编写程序非常简单,但是有些资源就直接在浏览器中打开了(.jpg,.png,.html,.htm...).
目前仅用在压缩包的下载。
2、IO流的方式
告诉浏览器以附件下载的方法打开。name为文件名称
response.setHeader("Content-Disposition",
"attachment;filename="+name);
A.编写jsp
<h1>IO流方式</h1>
<a href="DownLoadServlet1?fname=mm.jpg">美女.jpg</a><br/>
<a href="DownLoadServlet1?fname=1.zip">美女帅哥.zip</a>
B.创建DowLoadServlet1
======================================================
public class DownLoadServlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、接收参数
String fname = request.getParameter("fname");
//2、设置头通知,以附件下载的方式打开
response.setHeader("Content-Disposition",
"attachment;filename="+fname);
//3、IO操作
InputStream in = new FileInputStream(new File(getServletContext().getRealPath(fname)));
//响应输出流 (new FileOutputStream(new File(fname));在服务器的项目根目录下创建一个文件)
OutputStream out = response.getOutputStream();
byte bts[] = new byte[1024];
int len = -1;
while((len=in.read(bts))!=-1){
out.write(bts, 0, len);
}
in.close();
}
...
}
======================================================
测试发现,英文或数字的文件名下载没有问题,如果文件为中文时,下载时出现
问题:
C1:文件名称乱码
C2:下载后中文文件名消失。
解决办法:
======================================================
String fname = request.getParameter("fname");
fname = new String(fname.getBytes("ISO8859-1"),"UTF-8");
//2、设置头通知,以附件下载的方式打开
response.setHeader("Content-Disposition",
"attachment;filename="+URLEncoder.encode(fname, "UTF-8"));
======================================================
补充:文件上传时,为了防止文件重名,一般在上传后将文件生产新的名称,
该名称通常使用以下两种方式:IP时间戳(10804231201705051142123888.后缀)和 UUID产生字符串的方式。
遗留:URLEncoder.encode(fname, "UTF-8")对中文文件名后,有些浏览器不能够自动识别(比如火狐浏览器)。
3、文件转发的方法
A.编写jsp
======================================================
<h1>文件转发的方式</h1>
<a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=mm.jpg">美女(mm.jpg)</a><br/>
<a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=美女1.jpg">美女1.jpg</a><br/>
<a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=美女.jpg">美女.jpg</a><br/>
<a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=1.zip">美女帅哥.zip</a>
======================================================
B.创建DownLoadServlet2
======================================================
public class DownLoadServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、接收参数、处理乱码
String fname = request.getParameter("fname");
fname = new String(fname.getBytes("ISO8859-1"),"UTF-8");
//2、设置头通知,以附件下载的方式打开
response.setHeader("Content-Disposition",
"attachment;filename="+URLEncoder.encode(fname, "UTF-8"));
//3、文件转发
request.getRequestDispatcher(fname).forward(request, response);
}
...
}
======================================================
3、测试
======================================================
4总结:
如果仅仅是几个压缩包下载的话,建议使用超链接。
如果下载的文件各种类型的都有,不建议使用超链接的方式;
可以选择后两种方式,如果文件都不是太大的话,自由选择;如果文件想
实现一些自定义的一些功能(比如断点续传)建议使用IO流方式。

posted @ 2018-02-28 11:48  狂妄的老头  阅读(324)  评论(0编辑  收藏  举报