Проблемы с простым примером API Apache FileUpload - PullRequest
0 голосов
/ 01 апреля 2012

Я новичок в Java FileUpload API Apache, и для начала я нашел учебник , который объясняет, как FileUpload может использоваться в сервлете.Я использую Eclipse 3.7 и создал динамический проект, чтобы попробовать пример, описанный в ссылке.Ниже приведена структура каталогов моего проекта.

Project Directory Structure

Хотя код UploadImage.java такой же, как указано в примере, за исключением того, что у меня есть файл сервлета в пакете servlets иMIME-тип файла - изображение JPEG вместо обычного текста.Теперь я новичок в разработке сервлетов в Eclipse, но, насколько я понимаю, файл класса, созданный из сервлета, должен храниться в папке WEB-INF\classes, а его записи - в web.xml.Кроме того, код index.jsp такой же, как упомянуто в примере данного руководства.Теперь у меня <form action="/servlets.UploadImage" enctype="multipart/form-data" method="post"> в моем index.jsp.Когда я пытаюсь запустить проект, index.jsp выглядит просто забавно, но когда я выбираю файл изображения и нажимаю кнопку загрузки, я получаю ошибку 404 not found.Кроме того, как я могу заставить Eclipse помещать сгенерированный файл класса UploadImage.java в WEb-INF\classes при сборке проекта.

Я работал над этим простым примером в течение последних 4 часов и был новичком в сервлете.разработки в Eclipse, я не знаю, как с этим работать, поэтому любая помощь приветствуется.

Примечание: Все необходимые файлы .jar включены в библиотеки проекта.

Обновление: После внесения изменений, предложенных BalusC , я все еще не могу решить проблему.Я предоставляю точный код из 3 важных файлов проекта, который, я считаю, как-то связан с этой проблемой.Структура каталогов проекта остается такой же, как показано выше.

  • index.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Image Upload Example</title>
    <style type="text/css">
        #uploadimage {
            width: 150px;
            height: 150px;
            background: #f8f8f8;
        }
    </style>
    </head>
    <body>
    <div id="uploadimage">&nbsp;</div>
    <form action="servlets.UploadImage" enctype="multipart/form-data" method="post">
        <input type="file" name="file1"><br/>
        <input type="submit" value="Upload File"><br/>
    </form>
    </body>
    </html>
    
  • UploadImage.java (сервлет)

    package servlets;
    
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.annotation.*;
    import javax.servlet.http.*;
    
    import org.apache.commons.fileupload.*;
    import org.apache.commons.fileupload.disk.*;
    import org.apache.commons.fileupload.servlet.*;
    /**
     * Servlet implementation class UploadImage
     */
    @WebServlet("/UploadImage")
    public class UploadImage extends HttpServlet
    {
    
       private static final long serialVersionUID = 1L;
       private static final String temppath = System.getenv("temp");
       private File tempdir;
       private static final String storepath = "/Uploads";
       private File storedir;
    
       public void init(ServletConfig config) throws ServletException
       {
          super.init(config);
    
          tempdir = new File(temppath);
          if (!tempdir.isDirectory())
          {
             throw new ServletException(temppath + " is not a directory.");
          }
    
          String realpath = getServletContext().getRealPath(storepath);
    
          storedir = new File(realpath);
          if (!storedir.isDirectory())
          {
             throw new ServletException(storepath + " is not a directory.");
          }
       }
    
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
       {
          PrintWriter out = response.getWriter();
          response.setContentType("image/jpeg");
          out.println("<h2 align='center'>Impage Upload Example</h2>");
    
          DiskFileItemFactory fif = new DiskFileItemFactory();
          fif.setSizeThreshold(5 * 1024 * 1024);
          fif.setRepository(tempdir);
    
          ServletFileUpload uh = new ServletFileUpload(fif);
          try
          {
             List items = uh.parseRequest(request);
             Iterator itr = items.iterator();
             while (itr.hasNext())
             {
                FileItem item = (FileItem) itr.next();
                if (item.isFormField())
                {
                   out.println("File Name = " + item.getFieldName() + ", Value = " +                        item.getString());
                }
                else
                {
                   out.println("Field Name = " + item.getFieldName()
                        + ", File Name = " + item.getName()
                        + ", Content type = " + item.getContentType()
                        + ", File Size = " + item.getSize());
                   File file = new File(storedir, item.getName());
                   item.write(file);
                }
                out.close();
            }
        }
        catch (FileUploadException fex)
        {
           out.println("Error encountered while parsing the request<br/>" + fex);
        }
        catch (Exception ex)
        {
           out.println("Error encountered while parsing the request<br/>" + ex);
        }
      }
    }
    
  • web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web- app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>Apache FileUpload</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
      <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <servlet-name>UploadImage</servlet-name>
        <servlet-class>servlets.UploadImage</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>UploadImage</servlet-name>
        <url-pattern>/servlets.UploadImage</url-pattern>
      </servlet-mapping>
    </web-app>
    

Извините за столь длинный вопрос.: -Р

Ответы [ 2 ]

1 голос
/ 01 апреля 2012
<form action="/servlets.UploadImage" ...>

URL-адрес действия формы начинается с / и, следовательно, относится к корневому домену. Представьте, что ваш файл JSP открыт

http://localhost:8080/contextname/index.jsp

Затем этот относительный URL-адрес формы отправит запрос POST на следующий абсолютный URL

.

http://localhost:8080/servlets.UploadImage

в то время как это действительно должно было быть

http://localhost:8080/contextname/servlets.UploadImage

Итак, удалите начальный слеш.

<form action="servlets.UploadImage" ...>

Что касается вашего дополнительного вопроса:

Также, как я могу заставить Eclipse помещать сгенерированный файл класса UploadImage.java в WEb-INF \ classes при сборке проекта.

Это уже автоматически. Ну, если быть точным, в WEB-INF/classes, а не в WEb-INF/classes. Java чувствительна к регистру.

Тем не менее, у вас довольно странный шаблон URL. Почему не просто /upload?

Смотри также:

0 голосов
/ 01 апреля 2012

Что такое первая строка UploadImage.java? Если это

package servlets; 

тогда вместо использования

<servlet-class>UploadImage</servlet-class> 

использовать

<servlet-class>servlets.UploadImage</servlet-class>  

Файл UploadImage.class должен находиться в папке WEB-INF / classes / servlets. Вместо использования

 <url-pattern>/servlets.UploadImage</url-pattern>  

используйте что-то вроде

<url-pattern>/up</url-pattern>   

и перейдите к

<yourHost>/<yourWebAppName>/up
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...