文件的上传
一 概念
1.实现web开发中的文件上传功能,需完成如下二个步骤:
(1)在web页面中添加上传输入项(jsp页面或html页面)
(2)在 servlet中读取上传文件的数据,并保存在本地硬盘中
2.如何在web页面中添加输入项
<input type=”file”>标签用于在web页面中添加文件上传输入项
(1)必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据
(2)必须把form的enctype属性值设置为multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。
3.如何在servlet中读取文件中上传的数据并保存到本地硬盘中
使用Commons-fileupload组件实现文件上传
二 核心API
1.DiskFileItemFactory 工厂类
DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:
(1)public void setSizeThreshold(intsizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件。
(2)public void setRepository(java.io.Filerepository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").
(3)public DiskFileItemFactory(int
sizeThreshold, java.io.Filerepository) :构造函数
2. ServletFileUpload 解析类
ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:
(1)boolean isMultipartContent(HttpServletRequestrequest) :判断上传表单是否为multipart/form-data类型
(2)List parseRequest(HttpServletRequestrequest):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
(3)setFileSizeMax(longfileSizeMax) :设置上传文件的最大值
(4)setSizeMax(longsizeMax) :设置上传文件总量的最大值
(5)setHeaderEncoding(java.lang.Stringencoding) :设置编码格式
(6)setProgressListener(ProgressListenerpListener)
三 思路分析
1.文件上传的思路分析
文件上传必定要用jsp中的form标签来显示页面,只要把input的类型设置为file就OK,再者就是在点击上传文件按钮的时候,要做处理,处理当然要交到servelt层去处理了,在servlet中获取消息头中的值,并判断是否是输入项,如果正确,跳转到成功页面,如果失败,跳转到失败页面。注意在上面介绍了在web页面中添加的输入项,必须修改form表单中的默认选项。
2.实现的具体思路
在servelt中用Apache中提供的组件实现上传
Fileupload组件的工作流程
把请求消息中每一个请求项都解析成对象item1 item2...
Fileltem[] item = ServeltFileupLoad upload.parseRequest()
item1.isFormFiled()
如果返回的是true,则说明是普通的输入项,可调用
Item1.getString() 来得到输入项的值 老王
Item1.getFieldName() 得到输入项的名字 user
如果返回值是false,则说明是文件的上传项,可调用
Item1.getName()得到用户上传的文件的文件名
getInputStream()流对象得到内容
四 代码分析
1.upload.jsp页面 --- 用来给用户显示页面
<body>
<form action="${pageContext.request.contextPath}/servlet/uploadServlet" method="post" enctype="multipart/form-data">
上传用户:<input type="text" name="user"/><br/>
上传文件:<input type="file" name="file1"/><br/>
上传文件:<input type="file" name="file2"/><br/>
<input type="submit" value="上传文件"/>
</form>
</body>
2.UploadServlet2.java --- 用来处理从upload.jsp中传的值
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
try {
// (1)创建一个解析器工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// (2)得到解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//文件上传乱码
upload.setHeaderEncoding("utf-8");
// (3)对请求进行解析,有几个输入项,就有几个FileItem对象
List<FileItem> list = upload.parseRequest(request);
// (4)迭代list集合,获取list集合中的每一个输入项
for (FileItem item : list) {
// (1)判断输入的类型 item.isFormField()如果为真,为普通的输入项
if (item.isFormField()) {
// 普通的输入项
String inputName = item.getFieldName();//输入项的名称
String inputValue = item.getString();//输入项的value值
System.out.println("输入项的名称:" + inputName + " 输入项的value值 "
+ inputValue);
} else {
// 上传文件的输入项
// 上传文件的文件名,得到的是完全的路径
String fileName = item.getName(); fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);// 得到上传的文件名
// 1.txt(不同的浏览器,得到的文件名不一样)
InputStream is = item.getInputStream();// 得到上传的输入流
// 输出到本地磁盘上
FileOutputStream fos = new FileOutputStream("c:\\"+ fileName);
byte[] buff = new byte[1024];
int len = 0;
while ((len = is.read(buff)) > 0) {
fos.write(buff, 0, len);
}
is.close();
fos.close();
}
}
// 上传成功转向
request.setAttribute("message", "上传成功");
} catch (FileUploadException e) {
e.printStackTrace();
// 如果出现异常,转向
request.setAttribute("message", "上传失败");
}
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
3. message.jsp 成功或失败的跳转页面
<body>
<h2>${message}</h2>
</body>
分享到:
相关推荐
commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且...
采用apache commons 项目中的fileupload组件,实现了文件上传功能,它能够便利而简单地使得web应用程序和servlet具备高性能的文件上传能力,减小了直接操作输入输出流的系统开销。
文章为本人所写,向初学者展示了如何进行基于commons-fileupload组件的上传下载的详细开发过程。细致的说明相信能给您带来帮助。
Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。注意:使用Commons-fileupload...
用开源的FileUpload组件,可以很方便的给自己的系统添加功能强大的文件上传模块。 该资源文件是两个jar打包成的压缩文件。
用于servlet文件上传的组件,方便初学java web开发的人下载使用
struts2中用于文件上传的两个jar包,非常实用。最简单的文件上传,在做项目之前需要导入的jar包组件:commons-fileupload-1.2.2.jar、commons-io-2.2.jar(依赖包)
浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。
源码 博文链接:https://lisanlai.iteye.com/blog/660238
文件上传组件commons-fileupload-1.2.1英文API[CHM版]
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.
common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。 -下载后解压zip包,将commons-...
文件上传组件commons-fileupload用户指南文件上传组件commons-fileupload用户指南
Apache Commons FileUpload组件提供了一种简单而灵活的方法,可以向servlet和web应用程序添加对多部分文件上传功能的支持。commons-fileupload-1.2.2 commons-io-2.0.1
commons-fileupload上传组件,J2EE中JSP、Servlet所用到的文件上传组件包括commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar
博文链接:https://mqzsweet.iteye.com/blog/141965
基于HTTP传输协议的Web网页中,采用嵌入Commonsfileupload组件的Struts2框架,实现了文件的上传与下载.利用OGNL表达式提取Session持久层中的文件名,并利用此文件名实现下载文件的动态更名.灵活利用struts2.0自身...
Commons Fileupload是Apache commons众多开源组件中的一员,这种类库用于解析二进制数据流,一些框架如Struts里集成了Apache CommonFileupload类库来实现文件上传。
本文实例为大家分享了JSP使用commons-fileupload实现文件上传代码,供大家参考,具体内容如下 1、准备: 将commons-fileupload-1.1.zip和commons-io-1.1.zip复制到”\WEB-INF\lib”目录下 2、首先是Servlet:...