Загрузка сервлета java.io.FileNotFoundException: - PullRequest
5 голосов
/ 22 января 2012

Я пытаюсь создать форму загрузки с использованием сервлетов, и до сих пор у меня есть следующее:

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    if (isMultipart) {
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            List items = upload.parseRequest(request);
            Iterator iterator = items.iterator();
            while (iterator.hasNext()) {
                FileItem item = (FileItem) iterator.next();

                if (!item.isFormField()) {
                    String fileName = item.getName();

                    String root = getServletContext().getRealPath("");
                    File path = new File(root + "/uploads");

                    if (!path.exists()) {
                        boolean status = path.mkdirs();

                    }

                    File uploadedFile = new File(path + "/" + fileName);
                    System.out.println(uploadedFile.getAbsolutePath());
                    item.write(uploadedFile);

                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Кажется, что файлы загружаются нормально, однако всегда выдает исключение java.io.FileNotFoundException:Я сделал что-то не так?

ОШИБКА:

    /Applications/Tomcat/apache-tomcat-6.0.35/wtpwebapps/work/uploads/texsxxdddst.xml
/Applications/Tomcat/apache-tomcat-6.0.35/wtpwebapps/work/uploads
java.io.FileNotFoundException: /Applications/Tomcat/apache-tomcat-6.0.35/wtpwebapps/work/uploads (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:145)
    at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:426)
    at servlets.uploadServlet.doPost(uploadServlet.java:48)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:680)

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Я предполагаю, что каталог, в который вы хотите записать файлы, защищен от записи, или что у вас нет прав на запись в него.В любом случае вы не должны записывать эти файлы в этот каталог, потому что он будет удален, если вы удалите или повторно развернете веб-приложение.Учтите, что каталог Tomcat находится под ответственностью Tomcat.

Выберите каталог вне Tomcat, где вы хотите хранить свои загрузки, и настройте свое веб-приложение с параметром, содержащим этот путь.Используйте этот параметр в своем коде, чтобы получить путь и записать загруженные файлы.

1 голос
/ 22 января 2012

Пожалуйста, прочитайте документацию на http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/disk/DiskFileItemFactory.html:

Если не настроено иначе, значения конфигурации по умолчанию следующие:

  • Порог размера 10 КБ.
  • Репозиторий является системным временным каталогом по умолчанию, возвращаемым System.getProperty ("java.io.tmpdir").

Вы должны искать System.getProperty("java.io.tmpdir"), а не текущий рабочий каталог, который вы используете в данный момент.

В противном случае и, возможно, предпочтительнее, используйте перегруженный конструктор DiskFileItemFactory, чтобы явно указать, где хранятся ваши файлы.

Ответ JB одинаково действителен.Даже если вы исправите то, что я упомянул здесь, вам все равно нужно убедиться, что процесс / пользователь, с которым вы запускаете веб-приложение, имеет соответствующие права на любой каталог, который вы выберете.

...