commons-fileupload实现文件上传

文件上传

前端

进行文件上传时表单要做的准备

  1. 请求方式为post
    <form action="uploadServlet" method="post"></form>
  2. 使用file的表单域(name属性不能少,不然不能获取到文件IO流)
    <input type="file" name="file"/>
  3. 使用mutipart/form-data的请求编码编码方式(表示表单以二进制的形式传递)
    <form action="uploadServlet" method="post" enctype="mutipart/form-data">
    **注:**application/x-www-form-urlencoded为属性enctype的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用%HH代替(代表十六进制数),对于大容量的二进制数据和非ASCII字符的文本来说,这种编码不能满足需求
前端总结
<form action="uploadServlet" method="post" enctype="mutipart/form-data">
	请选择文件:<input type="file" name="file"/>
	<input type="submit" value="submit"/>
</form>

服务端

  1. 不能再使用request.getparParameter(“file”)的方式获取请求信息,因为请求编码格式已经变成mutipart/form-data,以二进制的方式来提交请求信息
  2. 可以使用输入流(request.getInputStream())的方式获取,但不建议这样做

第三种方式(使用第三方jar包)

  1. 导入commons-fileupload和commons-io包

  2. 获得List<FileItem>对象

    简单方法

     // Create a factory for disk-based file items
     DiskFileItemFactory factory = new DiskFileItemFactory();
    
     // Configure a repository (to ensure a secure temp location is used)
     ServletContext servletContext = this.getServletConfig().getServletContext();
     File repository = (File)
     servletContext.getAttribute("javax.servlet.context.tempdir");
     factory.setRepository(repository);
    
     // Create a new file upload handler
     ServletFileUpload upload = new ServletFileUpload(factory);
    
     // Parse the request
     List<FileItem> items = upload.parseRequest(request);
    
    简单方法测试写入到磁盘中,但磁盘中找不到文件

    复杂方法:可以设置一些属性

     // Create a factory for disk-based file items
     DiskFileItemFactory factory = new DiskFileItemFactory();
    
     // 设置总的文件大小,超出则写入临时文件中,以byte为单位
     factory.setSizeThreshold(yourMaxMemorySize);
     //设置临时文件,需创建一个File对象yourTempDirectory
     factory.setRepository(yourTempDirectory);
    
     // Create a new file upload handler
     ServletFileUpload upload = new ServletFileUpload(factory);
    
     // 设置总的文件大小
     upload.setSizeMax(yourMaxRequestSize);
    
     // Parse the request
     List<FileItem> items = upload.parseRequest(request);
    
  3. 使用isFormField()方法判断是表单域还是文件域

     if (item.isFormField()) {	//表单域
        			String name = item.getFieldName();
        			String value = item.getString();
                ...
            	}
        	
        
         if (!item.isFormField()) {		//文件域
        		String fieldName = item.getFieldName();
        		String fileName = item.getName();
        		String contentType = item.getContentType();
        		boolean isInMemory = item.isInMemory();
        		long sizeInBytes = item.getSize();
        		...
        		InputStream uploadedStream = item.getInputStream();
        		...
        		uploadedStream.close();
          }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值