简单Apache FileUpload API示例的问题

时间:2012-03-31 20:56:35

标签: eclipse jsp tomcat servlets file-upload

我是Apache的Java FileUpload API的新手,首先,我发现了tutorial,它解释了如何在Servlet中使用FileUpload。我正在使用Eclipse 3.7并创建了动态项目来尝试链接中解释的示例。以下是我的项目目录结构。

Project Directory Structure

虽然UploadImage.java的代码与示例中提到的相同,但我在servlets包中有servlet文件,文件MIME类型是JPEG图像而不是纯文本。现在,我是Eclipse中servlet开发的新手,但根据我的理解,从servlet创建的类文件必须保存在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中servlet开发的新手,我对如何使用它一无所知,所以任何帮助都会受到赞赏。

注意:所有必需的.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(servlet)

    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>
    

抱歉这么长的问题。 :-P

2 个答案:

答案 0 :(得分:1)

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

您的表单操作网址以/开头,因此相对于域根目录。想象一下,您的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

另见:

答案 1 :(得分:0)

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