我是Apache的Java FileUpload API的新手,首先,我发现了tutorial,它解释了如何在Servlet中使用FileUpload。我正在使用Eclipse 3.7并创建了动态项目来尝试链接中解释的示例。以下是我的项目目录结构。
虽然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"> </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
答案 0 :(得分:1)
<form action="/servlets.UploadImage" ...>
您的表单操作网址以/
开头,因此相对于域根目录。想象一下,您的JSP文件是由
然后,此相对表单操作URL将POST请求发送到以下绝对URL
虽然它应该真的是
因此,删除前导斜杠。
<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