文件上传
前端
进行文件上传时表单要做的准备
- 请求方式为post
<form action="uploadServlet" method="post"></form>
- 使用file的表单域(name属性不能少,不然不能获取到文件IO流)
<input type="file" name="file"/>
- 使用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>
服务端
- 不能再使用request.getparParameter(“file”)的方式获取请求信息,因为请求编码格式已经变成mutipart/form-data,以二进制的方式来提交请求信息
- 可以使用输入流(request.getInputStream())的方式获取,但不建议这样做
第三种方式(使用第三方jar包)
-
导入commons-fileupload和commons-io包
-
获得
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);
-
使用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(); }