文件上传细节2

使用Apache提供的开源注解Commons-Fileupload可以方便地实现一些细节处理:

1.设置每个上传文件的最大值,超过此值的文件,不允许上传(单位是byte)。

upload.setFileSizeMax(10*1024*1024);

若超过将会报FileUploadBase.FileSizeLimitExceededException异常,此异常是FileUploadBase类的内部类,此类在抛出时,最终被转换成运行时异常抛出,因此若要捕获此类,可通过如下代码来捕获:

catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//FileSizeLimitExceededException为FileUploadBase的内部类
			if(e instanceof FileUploadBase.FileSizeLimitExceededException){
				request.setAttribute("message", e.getMessage());
				request.getRequestDispatcher("/message.jsp").forward(request, response);
				return;
			}

2.设置所有上传文件总大小,超出此限制后,将不允许在进行上传

此限制是在一个request请求体内,所有要上传的文件大小总和不能超过此限制:

//设置总共能上传多少个文件
			upload.setSizeMax(1024*1024);
若超过,将会报此异常FileUploadBase.SizeLimitExceededException:

此异常同样是FileUploadBase的内部类,最终抛出时也是抛出一个运行时异常。同样可以通过如下方式对此异常进行捕获

if(e instanceof FileUploadBase.SizeLimitExceededException){
				request.setAttribute("message", e.getMessage());
				System.out.println("aaa");
				request.getRequestDispatcher("/message.jsp").forward(request, response);
				return;
			}

3.设置上传文件缓冲大小,文件大小小于此缓冲值是,文件数据将直接写到此缓冲中,然后再写到硬盘上。否则将使用临时文件来保存,然后再将临时文件拷贝到目标路径。

可以通过如下方式设置:

//设置文件最大缓冲大小为1k
			factory.setSizeThreshold(1024);
			//设置临时文件目录,当文件大于指定最大缓冲大小时,这些上传的文件将会先存放在临时文件夹中
			factory.setRepository(new File(this.getServletContext().getRealPath("/WEB-INF/temp")));

4.使用临时文件来保存时,最后需要将临时文件删除

可以通过调用FileItem的delete方法,调用此方法后,能确保在上传完后,将会删除临时文件夹中的副本。同时此方法必须在IO流关闭之后调用。下面这段是Delete方法注释说明

Deletes the underlying storage for a file item, including deleting any associated temporary disk file. Although this storage will be deleted automatically when the FileItem instance is garbage collected, this method can be used to ensure that this is done at an earlier time, thus preserving system resources


//模板代码,重request请求消息体中读取上传的表单文件,并写入到硬盘
					InputStream in = item.getInputStream();
					FileOutputStream out = new FileOutputStream(realPath+"\\"+saveFileName);
					byte[] buf = new byte[1024];
					int len = 0;
					while((len=in.read(buf))>0){
						out.write(buf);
					}
					in.close();
					out.close();
					
					//当指定临时文件时,在上传完后,将这些临时文件删除,必须在io流后调用
					item.delete();

5.通过监听器来显示文件上传进度

Commons-FileUpload组建有个接口ProgressListener,可以通过实现此接口来获取上传文件的上传进度条。其有个方法update,下面是这个方法的解释:

update

void update(long pBytesRead,
            long pContentLength,
            int pItems)
Updates the listeners status information.
Parameters:
pBytesRead - The total number of bytes, which have been read so far.
pContentLength - The total number of bytes, which are being read. May be -1, if this number is unknown.
pItems - The number of the field, which is currently being read. (0 = no item so far, 1 = first item is being read, ...)
此进度条是通过注册方式注册到文件上传解析器上的,及注册到ServletFileUpload对象中,可以通过此对象实体的setProgressListener方法来注册。注册后,文件上传时,将会自动触发此监听器,从而可以获取到上传过程中上传的进度信息。示例代码如下:

// 2.创建一个ServletFileUpload文件上传解析器
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setProgressListener(new ProgressListener(){

				@Override
				public void update(long pBytesRead, long pContentLength, int pItems) {
					// TODO Auto-generated method stub
					System.out.println("当前正在上传第"+pItems+"个文件, 已经读了"+pBytesRead+"字节/"+pContentLength);
				}
				
			});
注意:此监听器注册需要放在解析器解析request对象前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值