在javaWeb中我们如果想实现文件上传功能:
我们需要加入 文件上传所依赖的 jar包,以及它所依赖的 IO包。因为文件上传的实现底层也是通过字节流进行读写文件的。
普通方式实现文件上传较为麻烦,我们可以依赖于第三方jar包完成文件上传操作。
第一步:导入commons-fileupload-1.4.jar 和 commons-io-2.8.0.jar 包,这两个jar包如果版本不对应可能会出现异常。
第二步:创建一个文件上传表单页面:
注意:表单中必须要设置enctype属性
文件上传的表单元素 type属性为 file
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><hr><center><form action="fileUploadServlet" method="post" enctype="multipart/form-data">用户名:<input type="text" name="name"></br>图像:<input type="file" name="请选择文件"></br><input type="submit" name="上传"></form></center></body></html>
第三步:编写servlet类
首先我们需要创建一个临时文件目录,用来存放临时文件:从浏览器上传过来的图片等文件临时保存的位置。
在serlvet类中我们需要做的几步:
1.创建文件上传工厂对象
2.创建文件上传的核心对象
3.修改字符集
4.解析请求,获取表单提交的所有元素
5.通过判断元素是否为文件上传元素来进行不同的操作
具体实现代码:
@WebServlet(name = "FileUploadServlet", value = "/fileUploadServlet")public class FileUploadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取工厂FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload();upload.setHeaderEncoding("utf-8");upload.setFileItemFactory(factory);// 解析请求try {List<FileItem> fileItems = upload.parseRequest(request);String realPath = request.getServletContext().getRealPath("/upload/");System.out.println(realPath);for (FileItem f : fileItems) {if (f.isFormField()) {String fieldName = f.getFieldName();System.out.println(fieldName + "==" + f.getString());} else {File file = new File(realPath, f.getName() + "" + (Math.random() * 99));f.write(file);f.delete();}}} catch (FileUploadException e) {e.printStackTrace();} catch (Exception exception) {exception.printStackTrace();}}}
可能会出现的异常:
(1)FIleNotFondException:可能是因为目标文件的位置有问题。
(2)org.apache.commons.io.FileExistsException: Destination ‘D:\JAVAStudy\IDEAWorkSpace\JavaWebCode\javaWeb_1\myshopping\target\myshopping-1.0-SNAPSHOT\upload\1.jpg’ already exists:
原因:保存上传文件的文件名重复,目标地址中已经有了当前文件名的文件
解决方法:可以在文件的名称后边加上提交时间作为文件的保存名
