fileupload上传文件

上传文件有几个对表单必须的要求:

1、表单提交方法method="post"

2、form表单中要有enctype="multipart/form-data"的属性

3、表单中需要添加文件表单项:<input type="file" name="xxx" />


fileupload的核心类有:DiskFileItemFactoryServletFileUploadFileItem

使用fileupload组件的步骤如下:

1. 创建工厂类DiskFileItemFactory对象:DiskFileItemFactory factory = new DiskFileItemFactory()

2. 使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory)

3. 使用解析器来解析request对象:List<FileItem> list = fileUpload.parseRequest(request)


FileItem的方法:
  * boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
  * String getFieldName():返回当前表单项的名称;
  * String getString(String charset):返回表单项的值;
  * String getName():返回上传的文件名称
  * long getSize():返回上传文件的字节数
  * InputStream getInputStream():返回上传文件对应的输入流
  * void write(File destFile):把上传的文件内容保存到指定的文件中。
  * String getContentType();


具体 实例:


public class FIleUpLoadServlet3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//检查form表单是否是多部件表单,如果不是,向客户端输出“格式不正确”
		if(!ServletFileUpload.isMultipartContent(request)){
			response.getWriter().println("格式不正确");
			response.getWriter().flush();
			return;
		}
		//获取当前项目下的绝对路径+/upload的字符串全路径
		String fullPath = this.getServletContext().getRealPath("/.")+File.separator+"upload";
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//设置内存临界值 - 超过后将产生临时文件并存储于临时文件目录中
		factory.setSizeThreshold(1024*1024*3); //3M
		//设置临时存储目录
		factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
		//通过DiskFileItemFactory工厂创建ServletFileUpload对象
		ServletFileUpload upload = new ServletFileUpload(factory);
		//设置单个文件大小,在解析之前设置
		upload.setFileSizeMax(1024*1024*5);
		//设置总文件大小,在解析之前设置,否则抛出异常
		upload.setSizeMax(1024*1024*6);
		//通过upload的全路径创建创建文件夹
		File dir = new File(fullPath);
		if(!dir.exists()){
			dir.mkdirs();
		}
		try {
			//使用servletFileUpload对象解析request,每个FileItem都是一个表单项
			List<FileItem> items = upload.parseRequest(request);
			if(items != null && items.size()>0){
				for(FileItem item : items){
					//把文件表单项提取出来
					if(!item.isFormField()){
						String filename = item.getName();
						String Path = fullPath + File.separator + filename;
						//创建文件保存位置
						File source = new File(Path);
						//将文件写入保存位置
						item.write(source);
					}
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


注意:

文件一般存入到WEB-INF下,避免浏览器访问到

防止文件名重复,一般将文件名前加上uuid,使用上传日期建立文件夹进行分类

ServletFileUpload对象设置单个文件大小和整个表单大小都必须在解析request之前进行,如果文件超出大小限制,会抛出异常。

缓冲大小:一般默认超出10KB,才向硬盘保存。设置缓冲大小与临时目录除了示例方法外,还可以在构造函数中传入。

new DiskFileItemFactory(20*1024, new File("F:/temp"))



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值