Java实现文件的下载的方式
超链接方式下载
该方式就是一个链接,直接访问服务器中被下载文件的地址。
该方式缺点:
如果浏览器能够解析该文件的mime
类型,则浏览器打开该文件,反之才下载。
编码方式下载(访问Servlet)
通过编码的方式实现下载是开发中常用的方式。
步骤:
- 获取下载文件的文件名
String filename = request.getParameter("name");
- 根据获取的文件名从而获得该文件的mineType
ServletContext context = this.getServletContext();
String mineType = context.getMimeType(filename);
- 设置的类型mime
response.setContentType(mineType);
- 设置下载头信息
response.setHeader("Content-disposition", "attachment;filename="+filename);
5.提供流
说明:该示例下载资源统一放在了工程目录WebContent下的download下,download后面的"/"千万别忘记写。
InputStream is = context.getResourceAsStream("/download/"+filename);
Snip20171111_1.png
- 对拷流
// 3.1 获取输入流 // "/download"后必须有 "/"
InputStream is = context.getResourceAsStream("/download/"+filename);
// 3.2 获取输出流
ServletOutputStream ostream = response.getOutputStream();
// 对考
int len=-1;
byte[] b = new byte[1024];
while((len=is.read(b)) != -1) {
ostream.write(b, 0, len);
System.out.println(".........传输中.........");
}
System.out.println(".........下载完成.........");
// 关闭流
ostream.close();
is.close();
第6步对拷流可以使用框架''common-io-1.4.jar"一句代码玩成
下面是完整的代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 下载方式
// 方式一 超链接下载 开发中用的比较少
// 若浏览器能解析该资源的mime类型,则打开 否则下载
// <a href="${pageContext.request.contextPath }/download/Java WEB.xmind">下载Java WEB.xmind</a>
// 方式二 编码下载 通过Servlet完成
// 获取文件名称
String filename = request.getParameter("name");
System.out.println("filename="+filename);
// 1.设置文件的mime类型
// String mineType = this.getServletContext().getMimeType("文件名");
ServletContext context = this.getServletContext();
String mineType = context.getMimeType(filename);
// System.out.println(mineType);
response.setContentType(mineType);
// 2.设置下载头信息
// 注意Content-disposition 的C字母是大写 否则不会下载
// response.setHeader("content-desposition", "attachment;filename="+文件名称);
response.setHeader("Content-disposition", "attachment;filename="+filename);
// 3.提供流 对拷流
// 3.1 获取输入流 // "/download"后必须有 "/"
InputStream is = context.getResourceAsStream("/download/"+filename);
// 3.2 获取输出流
ServletOutputStream ostream = response.getOutputStream();
// 使用框架 拷贝流
IOUtils.copy(is, ostream);
// 关闭流
ostream.close();
is.close();
}
文件名问中文问题
中文名称的文件下载的下来的文件中文名称会出现问题。
解决:
- 常见的浏览器需要提供文件名称的utf-8编码 对于火狐来说需要提供文件名的base64编码
// 将文件名称使用utf-8编码 解决了中文文件名想 下载下来的文件名称问题
response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename, "utf-8"));
但是这种方式只是解决了常见的浏览器,火狐浏览器还是存在问题,下载的文件名为类似%E7%AC%94%E8%AE%B0这种。接下来提供一个自己封装工具类DownLoadUtils
针对浏览器作不同的文件名编码。
DownLoadUtils.java
public class DownLoadUtils {
public static String getName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
那么我们可以使用工具类设置对应的编码了
response.setHeader("Content-disposition", "attachment;filename="+DownLoadUtils.getName(request.getHeader("user-agent"), filename));
Snip20171111_2.png
网友评论