文件的下载
一 概述
1.下载的两种方式
(1)超链接直接指向下载资源
(2)程序实现下载需设置两个响应头
设置Content-Type 的值为:application/x-msdownload。Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件。
Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type.
(3)下载文件
因为要下载的文件可以是各种类型的文件,所以要将文件传送给客户端,其相应内容应该被当做二进制来处理,所以应该调用方法返回 ServeltOutputStream 对象来向客户端写入文件内容。
二 下载案例过程
1.分析思路:遍历上传目录下的所有文件显示给用户,并允许用户完成下载
2. 实现思路
(1)ListFileServlet.java 读取某一个文件夹下的所有的文件---list对象--à存入request作用域范围内
(2)Listfiles.jsp ------ 列出所有的可下载资源
(3)DownloadServlet.java ------- 具体实现
三 代码分析
1.将某一个文件夹下 的文件获取到存放到Map-key-value集合中(UUIDname--文件),存到作用域范围
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取文件的路径
String savePath = this.getServletContext().getRealPath("WEB-INF/upload");
//定义map映射类,来存储uuidname和realname
Map map = new HashMap();
//去调用这个方法来得到文件名的路径
listFiles(new File(savePath),map);
//存到作用域中,让jap页面去访问,并输出
request.setAttribute("map", map);
request.getRequestDispatcher("/listfiles.jsp").forward(request, response);
}
//递归方法遍历该文件夹下的所有文件及子文件夹下的文件
private void listFiles(File file,Map map){
if(file.isFile()){
//如果是文件
String uuidname = file.getName();//获取的是uuid的文件名
String realname = uuidname.substring(uuidname.indexOf("_")+1);
map.put(uuidname, realname);
}else{
//不是文件,而是文件夹
File[] files = file.listFiles();//得到某一个文件夹里的所有东西
for(File f:files){
listFiles(f,map);
}
}
}
2.显示文件名,从map中获取
<body>
<h2>下载资源列表</h2>
<c:forEach items="${map}" var="me">
<%--生成要访问的资源的地址,可以自动的附加参数--%>
<c:url value="/servlet/DownloadServlet" var="fileAddr">
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
文件名:${me.value} <a href="${fileAddr}">下载</a><br/>
</c:forEach>
</body>
3.下载的具体实现
// 文件的下载
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 找到用户所选定的文件
String uuidname = request.getParameter("filename");
uuidname = new String(uuidname.getBytes("ISO8859-1"), "utf-8");
String realname = uuidname.substring(uuidname.indexOf("_")+1);
// 确定文件的保存位置
String savePath = getFileAddr(realname);
File f = new File(savePath + "\\" + uuidname);
//System.out.println(savePath+"<br/>"+uuidname);
if (f.exists()) {
// 设置应答的相应消息头
response.setContentType("application/x-msdownload");
String str = "attachment;filename="+ java.net.URLEncoder.encode(realname, "utf-8");
response.setHeader("Content-Disposition", str);
// 创建一 个输入流对象和指定的文件相关联
FileInputStream in = new FileInputStream(f);
// 从response对象中获取到输出流对象
OutputStream out = response.getOutputStream();
// 从输入流对象中读数据写入到输出流对象中
byte[] buff = new byte[1024];
int len = 0;
while ((len = in.read(buff)) > 0) {
out.write(buff, 0, len);
}
}else{
request.setAttribute("message", "下载资源不存在");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
//根据文件名查找路径
private String getFileAddr(String filename) {
int dir1 = filename.hashCode() & 0x0f;
int dir2 = filename.hashCode()>>4 & 0x0f;
System.out.println(dir1+"===="+dir2);
String savePath = this.getServletContext().getRealPath("WEB-INF/upload")
+ "\\" + dir1 + "\\" + dir2;
System.out.println("============="+savePath);
return savePath;
}
分享到:
相关推荐
commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且...
文章为本人所写,向初学者展示了如何进行基于commons-fileupload组件的上传下载的详细开发过程。细致的说明相信能给您带来帮助。
用开源的FileUpload组件,可以很方便的给自己的系统添加功能强大的文件上传模块。 该资源文件是两个jar打包成的压缩文件。
采用apache commons 项目中的fileupload组件,实现了文件上传功能,它能够便利而简单地使得web应用程序和servlet具备高性能的文件上传能力,减小了直接操作输入输出流的系统开销。
用于servlet文件上传的组件,方便初学java web开发的人下载使用
Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。注意:使用Commons-fileupload...
struts2中用于文件上传的两个jar包,非常实用。最简单的文件上传,在做项目之前需要导入的jar包组件:commons-fileupload-1.2.2.jar、commons-io-2.2.jar(依赖包)
源码 博文链接:https://lisanlai.iteye.com/blog/660238
浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。
-下载后解压zip包,将commons-fileupload-1.1.1.jar,和commons-io-1.2.jar(这里我们用的是更新的版本,但是用法是一样的)复制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目录不存在请自建目录。 新建一个...
Java借助commons-fileupload组件实现文件上传所需包 Apache Commons FileUpload 1.4 (requires Java 1.6 or later) Note: This version of Commons FileUpload also requires Commons IO 2.2.
Apache Commons FileUpload组件提供了一种简单而灵活的方法,可以向servlet和web应用程序添加对多部分文件上传功能的支持。commons-fileupload-1.2.2 commons-io-2.0.1
文件上传组件commons-fileupload-1.2.1英文API[CHM版]
commons-fileupload上传组件,J2EE中JSP、Servlet所用到的文件上传组件包括commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar
文件上传组件commons-fileupload用户指南文件上传组件commons-fileupload用户指南
基于HTTP传输协议的Web网页中,采用嵌入Commonsfileupload组件的Struts2框架,实现了文件的上传与下载.利用OGNL表达式提取Session持久层中的文件名,并利用此文件名实现下载文件的动态更名.灵活利用struts2.0自身...
Commons Fileupload是Apache commons众多开源组件中的一员,这种类库用于解析二进制数据流,一些框架如Struts里集成了Apache CommonFileupload类库来实现文件上传。
博文链接:https://mqzsweet.iteye.com/blog/141965
这是jakarta提供的commons fileupload组件的jar包和API文档,fileupload组件可以很好的支持文件的上传。