当我使用Apache Tomcat 7.0.34使用“org.apache.tomcat.util.fileupload”进行文件上传时,不会显示错误,一切正常。但是当我使用Apache Tomcat 7.0.40时,“parseRequest(request)”行中出现了一个错误。我无法将此视为错误,因为如果我使用RequestContext,那么错误将会消失,但我不知道如何使用RequestContext接口。请帮我如何使用RequestContext,因为我需要将实例传递给“parseRequest(RequestContext ctx)”方法。
public void service(HttpServletRequest request,HttpServletResponse response)
{
response.setContentType("text/html;charset=UTF-8");
String status=null;
List<FileItem> items=null;
try
{
if(ServletFileUpload.isMultipartContent(request))
{
items=new ServletFileUpload(new
DiskFileItemFactory()).parseRequest(request);
for(FileItem item:items)
{
if(item.getFieldName().equals("status"))
status=item.getString();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
我需要将RequestContext实例放在parseRequest(RequestContext ctx)中,但不知道如何使用RequestContext。
答案 0 :(得分:4)
这是不在Servlet 3.0中处理文件上传的正确方法。您应该在servlet上使用@MultipartConfig
注释,并使用HttpServletRequest#getPart()
方法获取Servlet 3.0中引入的上传文件。
org.apache.tomcat.util.fileupload
包正好包含了这个新的Servlet 3.0功能的所有“幕后”工作的类。您不应该直接使用它们,就像在Sun / Oracle JVM上使用Java SE时不应该使用sun.*
类,并且在不应该使用com.mysql.*
类时在MySQL DB上使用JDBC。您似乎对使用Apache Commons FileUpload的使用How to upload files to server using JSP/Servlet?的Servlet 2.5或更早版本的示例感到困惑。这些示例恰好使用相同的类名。
使用特定于Tomcat的类会将您的webapp紧密耦合到特定的Tomcat版本,并使您的webapp 不可移植到其他Servlet 3.0兼容容器,甚至是您自己遇到的不同Tomcat版本。在这种特殊情况下,您应该坚持使用javax.servlet
包中的标准类。
正确的方法显示在这个答案的第二部分:{{3}}
总而言之,这个启动示例应该让你开始:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="status" />
<input type="file" name="uploadedFile" />
<input type="submit" />
</form>
与
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String status = request.getParameter("status"); // Retrieves <input type="text" name="status">
Part uploadedFile = request.getPart("uploadedFile"); // Retrieves <input type="file" name="uploadedFile">
InputStream content = uploadedFile.getInputStream();
// ... (do your job here)
}
}
就是这样。