servlet文件上传(2)---》利用commons-fileupload组件

通过servlet提供的接口和方法也能实现文件上传,但是处理有可能麻烦一些,作为新人,而且目前这个时间点要求能尽快实现功能需求,所以直接进入使用commons-fileupload组件实现文件上传。Commons是Apache的一个Java子项目,项目主要涉及一些开发中常用模块。例如文件上传、数据库连接池、XML配置文件处理等。

commons-fileupload组件性能好,而且支持任意大小文件的上传。当然这些不是我的感受,前人的总结。嘿嘿。

关于原理性的内容请查看servlet文件上传(1)

官网下载地址:        http://commons.apache.org/proper/commons-fileupload/


选择Dounloading里面的最新版本下载

commons-fileupload组件依赖于Apache另外一个子项目:commons-io

下面就直接贴代码(Servlet里面doPost()方法中),看完代码后再阐述一下处理过程

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//项目绝对路径
		//getServletContext().getRealPath("/");
		DiskFileItemFactory itemFactory = new DiskFileItemFactory();
		//设置内存缓冲区的阈值(临界值)
		itemFactory.setSizeThreshold(0x80000);
		File tempDir = new java.io.File("C:\\temp");
		if (!tempDir.exists()) {
			tempDir.mkdir();
		}
		itemFactory.setRepository(tempDir);  //设置临时存储文件
		ServletFileUpload sfu = new ServletFileUpload(itemFactory);  //这个对象解析文件流
		sfu.setSizeMax(20*1024*1024);  //设置上传文件的最大数据量为20M
		//开始解析上传文件流,得到FileItem对象的列表
		try {
			List fileItems = sfu.parseRequest(request);
			Iterator iterator = fileItems.iterator();
			//依次处理每个上传文件
			while(iterator.hasNext()) {
				FileItem item = (FileItem) iterator.next();
				//判断是否是文件字段
				if (!item.isFormField()) {
					String name = item.getName();
					long size = item.getSize();
					if ((name==null) || name.equals("") && size==0) {
						continue;
					}
					File uploadFileDir = new File(getServletContext().getRealPath("/"));
					if (!uploadFileDir.exists()) {
						uploadFileDir.mkdir();
					}
					String id = request.getParameter("id");
					File file = new File(uploadFileDir, id+".png");
					try {
						item.write(file);
					} catch (Exception e) {
						e.printStackTrace();
					}
					
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		out.flush();
		out.close();

这里用到了三个接口和类:

FileItem              DiskFileItemFactory                ServletFileUpload

【1】ServletFileUpload负责解析上传文件流,通过setSizeMax()可以设置上传文件的最大数据量,它里面含有DiskFileItemFactory引用,并将每部分的数据封装到一个FileItem,通过ServletFileUpload的parseRequest(request)即可获取LIst<FileItem>。

【2】DiskFileItemFactory是创建FileItem对象的工厂类,在这个工厂类中可以配置内存缓冲区的大小和存放临时文件的目录,然后传递给ServletFileUpload对象

【3】ServletFileUpload在接收上传文件数据时,会将文件内容保存到内存缓冲区中,如果文件内容超过了DiskFileItemFactory指定的缓冲区大小,那么文件内容将被保存到磁盘上,存储为DiskFileItemFactory指定目录中的临时文件。等文件数据都接收完毕后,ServletFileUpload再从临时文件中将数据写入到上传文件目录下的文件中

【4】一个FileItem实例化对象对应一个文件流的一个部分,该接口主要方法如下:

(1)public byte[] get()  以字节数组的形式返回文件数据项的内容

(2)public java.lang.String getContentTye()      返回客户端浏览器设置的文件数据项的MIME类型

(3)public java.lang.String getFieldName()      返回文件数据项对应的表单中的字段的名字

(4)public  java.lang.String getName()     返回在客户端文件系统中文件的原始文件名,由客户端浏览器提供

(5)public java.io.InputStream getInputStream() throws java.io.IOException  返回一个输入流,用于读取文件的内容

(6)public java.io.OutputStream getOutputStream() throws java.io.IOException  返回一个输出流,利用这个输出流可以存储文件的内容

(7)public long getSize()  返回文件数据项的大小

(8)public java.lang.String getString()   使用默认的字符编码,以字符串的形式返回文件数据项的内容

(9)public java.lang.String getString(String charset) throws java.io.UnsupportedEncodingException     使用指定的编码方式。

(10)public boolean isFormField()   判断FileItem对象是否表示一个简单的表单字段

(11)public void write(java.io.File file) throws java.lang.Exception   将文件数据项的内容写到硬盘上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值