在javaWeb中我们如果想实现文件上传功能:
    我们需要加入 文件上传所依赖的 jar包,以及它所依赖的 IO包。因为文件上传的实现底层也是通过字节流进行读写文件的。
    普通方式实现文件上传较为麻烦,我们可以依赖于第三方jar包完成文件上传操作。
    第一步:导入commons-fileupload-1.4.jar 和 commons-io-2.8.0.jar 包,这两个jar包如果版本不对应可能会出现异常。
    第二步:创建一个文件上传表单页面:
    注意:表单中必须要设置enctype属性
    文件上传的表单元素 type属性为 file

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. <hr>
    8. <center>
    9. <form action="fileUploadServlet" method="post" enctype="multipart/form-data">
    10. 用户名:<input type="text" name="name"></br>
    11. 图像:<input type="file" name="请选择文件"></br>
    12. <input type="submit" name="上传">
    13. </form>
    14. </center>
    15. </body>
    16. </html>

    第三步:编写servlet类
    首先我们需要创建一个临时文件目录,用来存放临时文件:从浏览器上传过来的图片等文件临时保存的位置。
    图片.png
    在serlvet类中我们需要做的几步:
    1.创建文件上传工厂对象
    2.创建文件上传的核心对象
    3.修改字符集
    4.解析请求,获取表单提交的所有元素
    5.通过判断元素是否为文件上传元素来进行不同的操作

    具体实现代码:

    1. @WebServlet(name = "FileUploadServlet", value = "/fileUploadServlet")
    2. public class FileUploadServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. this.doPost(request, response);
    6. }
    7. @Override
    8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. // 获取工厂
    10. FileItemFactory factory = new DiskFileItemFactory();
    11. ServletFileUpload upload = new ServletFileUpload();
    12. upload.setHeaderEncoding("utf-8");
    13. upload.setFileItemFactory(factory);
    14. // 解析请求
    15. try {
    16. List<FileItem> fileItems = upload.parseRequest(request);
    17. String realPath = request.getServletContext().getRealPath("/upload/");
    18. System.out.println(realPath);
    19. for (FileItem f : fileItems) {
    20. if (f.isFormField()) {
    21. String fieldName = f.getFieldName();
    22. System.out.println(fieldName + "==" + f.getString());
    23. } else {
    24. File file = new File(realPath, f.getName() + "" + (Math.random() * 99));
    25. f.write(file);
    26. f.delete();
    27. }
    28. }
    29. } catch (FileUploadException e) {
    30. e.printStackTrace();
    31. } catch (Exception exception) {
    32. exception.printStackTrace();
    33. }
    34. }
    35. }

    可能会出现的异常:
    (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:
    原因:保存上传文件的文件名重复,目标地址中已经有了当前文件名的文件
    解决方法:可以在文件的名称后边加上提交时间作为文件的保存名图片.png