你真的了解文件上传技术么?——FileUpload实现文件上传

文件上传技术

  • serlet3.0技术
  • JSPSmartUpload jsp +javabean的开发模式,用在jsp里
  • FileUpload 实现的是java环境下的文件上传
  • 以及各大开发框架大多使用的是上面FileUpload的技术,对其进行了封装,例如Spring中的CommonsMultipartFile类也是实现文件上传的技术,其实也是封装了FileUpload技术

文件上传的三要素

  • 表单提交方式为post
  • 表单中需要有文件上传表单项,必须有name属性 <input type="file" name="upload">
  • 表单的enctype的属性值需要是multipart/form-data

API介绍

  • FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,组件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程有相应的jar包支持
  • 在commons.apache.org下载需要的jar包下载的地址为:
    http://commons.apache.org/downloads/index.html,需要下载IO和FileUpload支持的jar包,下载release发布版本,下载binaries(二进制)版本,编译好的版本

核心类介绍

  • DiskFileItemFactory 磁盘文件项工厂
    ServletFileUpload 核心解析类
    FileItem 文件项 (是一个接口,如果要看源码,实现类为:DiskFileItem 位置:org.apache.commons.fileupload.disk.DiskFileItem,可以看见相应的源码的实现)

  • 官方参考文档:http://commons.apache.org/proper/commons-fileupload/apidocs/index.html

jsp demo如下

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>文件上传</h1>
	<form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
		<input type="text" name="name"><br/>
		<input type="file" name="upload"><br/>
		<input type="submit" value="上传">
	</form>
</body>
</html>

java demo如下

@WebServlet(urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		File file =new File("G:\\test");
		//如果服务器上传的文件名称出现乱码,可以设置下面请求的编码。(可选项)
		request.setCharacterEncoding("UTF-8");
		// 1.创建磁盘文件项工厂(1k=1024bytes(字节)),设置初始缓冲区的大小为1M,设置默认缓冲文件位置为file,
		//当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件
		//也可以使用默认无参构造,默认为:缓冲区为10k,位置:java.io.tmpdir
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(1024*1024,file);
		// 2.创建核心解析类
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
	    //设置所有上传数据的最大值,单位字节long  100M  (可选项)
		fileUpload.setSizeMax(1024*1024*100);
        //设置单个文件上传的最大值 10M  (可选项)
		fileUpload.setFileSizeMax(1024*1024*10);
        //设置编码格式  (可选项)
		fileUpload.setHeaderEncoding("UTF-8");

		// 3.解析请求对象,将请求分成几个部分(FileItem)
		try {
			List<FileItem> list= fileUpload.parseRequest(request);
			// 4.遍历集合获得每个部分的对象
			for(FileItem fileItem:list){
				// 判断是普通项还是文件上传项
				if(fileItem.isFormField()){
					// 普通项
					// 获得普通项的名称:
					String name = fileItem.getFieldName();
					// 获得普通项的值:
					String value = fileItem.getString("UTF-8");
					System.out.println(name+"  "+value);
				}else{
					// 文件上传项
					// 获得文件的名称:
					String fileName = fileItem.getName();
					// 获得文件的输入流:
					InputStream is = fileItem.getInputStream();
					// 需要将文件写入到服务器的某个路径即可:[可以自己定义一个服务器的路径]
					String path = getServletContext().getRealPath("/upload");
					System.out.println(path);
					// 创建输出流 与 输入流进行对接:向该路径下输出文件
					OutputStream os = new FileOutputStream(path+"\\"+fileName);
					int len = 0;
					byte[] b = new byte[1024];
					while((len = is.read(b))!=-1){
						os.write(b, 0, len);
					}
					is.close();
					os.close();
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
发布了31 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/cchulu/article/details/104861441
今日推荐