{"id":520,"date":"2022-11-26T11:03:52","date_gmt":"2022-11-26T03:03:52","guid":{"rendered":"https:\/\/scutvk.cn\/?p=520"},"modified":"2023-02-14T16:13:50","modified_gmt":"2023-02-14T08:13:50","slug":"jakarta-servlet-cannot-use-servletfileupload-parserequest-to-convert-httprequest-obj-to-listfileitem-obj-duplicate","status":"publish","type":"post","link":"https:\/\/scutvk.cn\/?p=520","title":{"rendered":"jakarta Servlet cannot use ServletFileUpload.parseRequest() to convert HttpRequest obj to List obj [duplicate]"},"content":{"rendered":"\n<p class=\"has-text-align-center\" style=\"font-size:15px\">\u539f\u521b\u6587\u7ae0\uff0c\u7981\u6b62\u79c1\u81ea\u8f6c\u8f7d \/ Original article, private reproduction prohibited<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size\"><strong>The situation at the time I encountered the problem.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>full code:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import jakarta.servlet.ServletException;\nimport jakarta.servlet.http.HttpServlet;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.apache.commons.fileupload.FileItem;\nimport org.apache.commons.fileupload.FileUploadException;\nimport org.apache.commons.fileupload.RequestContext;\nimport org.apache.commons.fileupload.disk.DiskFileItemFactory;\nimport org.apache.commons.fileupload.servlet.ServletFileUpload;\n\nimport java.io.*;\nimport java.util.List;\n\npublic class UploadServlet extends HttpServlet {\n    private static final long serialVersionUID = 1L;\n    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        doPost(req, resp);\n    }\n\n    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        try {\n            \/\/ set Content-Type\n            resp.setHeader(\"Content-type\", \"text\/html;charset=UTF-8\");\n            \/\/ create DiskFileItemFactory object\n            DiskFileItemFactory factory = new DiskFileItemFactory();\n            \/\/ set file temporary storage path, if the path does not exist, create it\n            factory.setRepository(new File(\"D:\\\\source\\\\jsp\\\\fileupdown\\\\temp\"));\n            if (!factory.getRepository().exists()) {\n                factory.getRepository().mkdirs();\n            }\n            \/\/ set ServletFileUpload object\n            ServletFileUpload upload = new ServletFileUpload(factory);\n            \/\/ set character encoding\n            upload.setHeaderEncoding(\"UTF-8\");\n            \/\/ analyze request, get file item list\n            List&lt;FileItem&gt; fileitems = upload.parseRequest(req);\n            \/\/ get byte stream\n            PrintWriter writer = resp.getWriter();\n            \/\/ traverse file item list\n            for (FileItem fileitem : fileitems) {\n                \/\/ if it is a form field\n                if (fileitem.isFormField()) {\n                    \/\/ get field name\n                    String name = fileitem.getFieldName();\n                    if (name.equals(\"name\")) {\n                        if (fileitem.getString(\"UTF-8\").equals(\"\")) {\n                            writer.println(\"name can not be empty\");\n                        } else {\n                            writer.println(\"name:\" + fileitem.getString(\"UTF-8\"));\n                        }\n                    }\n                } else {\n                    \/\/ get file name\n                    String filename = fileitem.getName();\n                    \/\/ process file\n                    if (filename != null &amp;&amp; !filename.equals(\"\")) {\n                        writer.print(\"uploaded file:\" + filename + \"&lt;br&gt;\");\n                        filename = filename.substring(filename.lastIndexOf(\"\\\\\") + 1);\n                        \/\/ unique file name\n                        String uniqueFileName = System.currentTimeMillis() + \"_\" + filename;\n                        \/\/ create same name file in server\n                        String webPath = \"\/upload\/\";\n                        String realPath = getServletContext().getRealPath(webPath + uniqueFileName);\n                        \/\/ create file\n                        File file = new File(realPath);\n                        file.getParentFile().mkdirs();\n                        file.createNewFile();\n                        \/\/ get UploadStream\n                        InputStream in = fileitem.getInputStream();\n                        \/\/ use FileOutputStream to write file\n                        FileOutputStream out = new FileOutputStream(file);\n                        \/\/ create buffer\n                        byte[] buffer = new byte[1024];\n                        int len = 0;\n                        \/\/ read file\n                        while ((len = in.read(buffer)) &gt; 0) {\n                            out.write(buffer, 0, len);\n                        }\n                        in.close();\n                        out.close();\n                        writer.println(\"upload successfully\");\n                    } else {\n                        writer.println(\"file can not be null\");\n                    }\n                }\n            }\n        } catch (FileUploadException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n}<\/code><\/pre>\n\n\n\n<p><strong>the error:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">java: Cannot access javax.servlet.http.HttpServletRequest\nCannot find class file of javax.servlet.http.HttpServletRequest<\/code><\/pre>\n\n\n\n<p><strong>the code that reports the error:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">\/\/ set ServletFileUpload object\nServletFileUpload upload = new ServletFileUpload(factory);\n\/\/ set character encoding\nupload.setHeaderEncoding(\"UTF-8\");\n\/\/ analyze request, get file item list\nList&lt;FileItem&gt; fileitems = upload.parseRequest(req);\n<\/code><\/pre>\n\n\n\n<p><strong>I have tried to rewrite the code as follows, but it still cannot work.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">\/\/ set ServletFileUpload object\nServletFileUpload upload = new ServletFileUpload(factory);\n\/\/ set character encoding\nupload.setHeaderEncoding(\"UTF-8\");\n\/\/ analyze request, get file item list\nList&lt;FileItem&gt; fileitems = upload.parseRequest((RequestContext) req);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size\">How to fix the problem?<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>I found that this was caused by the fact that the source code on the net about servlet implementation of file download was out of date. So we should try to use our servlet code&nbsp;with the current state of technology.<\/p>\n\n\n\n<p>And here&#8217;s my new code to implement the function of file download.<\/p>\n\n\n\n<p><strong>jsp\/html<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">&lt;%@ page contentType=\"text\/html;charset=UTF-8\" language=\"java\" %&gt;\n&lt;html&gt;\n  &lt;head&gt;\n    &lt;title&gt;\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d&lt;\/title&gt;\n  &lt;\/head&gt;\n  &lt;body&gt;\n    &lt;form action=\"UploadServlet\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n      &lt;table style=\"width: 600px\"&gt;\n        &lt;tr&gt;\n          &lt;td&gt;username&lt;\/td&gt;\n          &lt;td&gt;&lt;input type=\"text\" name=\"name\"\/&gt;&lt;\/td&gt;\n        &lt;\/tr&gt;\n        &lt;tr&gt;\n          &lt;td&gt;file&lt;\/td&gt;\n          &lt;td&gt;&lt;input type=\"file\" name=\"file\"\/&gt;&lt;\/td&gt;\n        &lt;\/tr&gt;\n        &lt;tr&gt;\n          &lt;td&gt;&lt;input type=\"submit\" name=\"upload\"\/&gt;&lt;\/td&gt;\n        &lt;\/tr&gt;\n      &lt;\/table&gt;\n    &lt;\/form&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p><strong>servlet<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import jakarta.servlet.ServletException;\nimport jakarta.servlet.annotation.MultipartConfig;\nimport jakarta.servlet.annotation.WebInitParam;\nimport jakarta.servlet.annotation.WebServlet;\nimport jakarta.servlet.http.HttpServlet;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.Part;\nimport java.io.*;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\n@WebServlet(name = \"UploadServlet\",\n            value = \"\/UploadServlet\",\n            initParams = {\n                    @WebInitParam(name = \"upload_location\", value = \"D:\\\\source\\\\jsp\\\\fileupdown\\\\uploadfiles\")\n            })\n@MultipartConfig\npublic class UploadServlet extends HttpServlet {\n    private static final long serialVersionUID = 1L;\n    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        doPost(req, resp);\n    }\n\n    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        try {\n            \/\/ set Content-Type\n            resp.setHeader(\"Content-type\", \"text\/html;charset=UTF-8\");\n            \/\/ get file stream\n            String name = req.getParameter(\"name\"); \/\/ Retrieves &lt;input type=\"text\" name=\"name\"&gt;\n            Part filePart = req.getPart(\"file\"); \/\/ Retrieves &lt;input type=\"file\" name=\"file\"&gt;\n            if (filePart == null){\n                resp.getWriter().print(\"please choose a file\");\n                return;\n            }\n            String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); \/\/ MSIE fix.\n            \/\/ save file\n            File uploads = new File(getServletConfig().getInitParameter(\"upload_location\"));\n            File file = new File(uploads, fileName);\n            try (InputStream input = filePart.getInputStream()) {\n                Files.copy(input, file.toPath());\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        } catch (ServletException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n}\n\n<\/code><\/pre>\n\n\n\n<p>One thing to look out for in the code:<\/p>\n\n\n\n<p>Remember to add <code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">@MultipartConfig<\/mark><\/code> in front of this your servlet, or you will receive null in <code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Part filePart = req.getPart(\"file\");<\/mark><\/code> .<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Reference:<\/p>\n\n\n\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/2422468\/how-can-i-upload-files-to-a-server-using-jsp-servlet\" target=\"_blank\" rel=\"noopener\">java &#8211; How can I upload files to a server using JSP\/Servlet? &#8211; Stack Overflow<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/18664579\/recommended-way-to-save-uploaded-files-in-a-servlet-application\/18664715#18664715\" target=\"_blank\" rel=\"noopener\">tomcat &#8211; Recommended way to save uploaded files in a servlet application &#8211; Stack Overflow<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>java: Cannot access javax.servlet.http.HttpServletRequest<br \/>\nCannot find class file of javax.servlet.http.HttpServletRequest<\/p>\n","protected":false},"author":1,"featured_media":522,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[2,24,5],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/scutvk.cn\/wp-content\/uploads\/2022\/11\/Java_programming_language-Logo.wine_.png","_links":{"self":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts\/520"}],"collection":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=520"}],"version-history":[{"count":5,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts\/520\/revisions"}],"predecessor-version":[{"id":614,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts\/520\/revisions\/614"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/media\/522"}],"wp:attachment":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}