1

我已经编写了下面的方法,该方法由我的 doPost 方法调用来解析multipart/form-data请求中给出的。这一切都很好,我只是不明白发生了什么。如果有人能在我的尝试中分解这三行,我将不胜感激。我已经阅读了Apache Commons File Upload 文档,但这对我来说没有意义,我讨厌编写我不完全理解的代码。特别是,我想知道创建工厂和上传对象时实际发生了什么。

public static List<FileItem> parseFormRequest(HttpServletRequest request)
{
    List<FileItem> items = null;

    try 
    {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        items = upload.parseRequest(request);
    } 
    catch (FileUploadException error) 
    {
        System.out.println("UploadFileServlet - Error With File Parsing - " + error.getMessage());
    }

    return items;
}

奖金帮助!

我也收到了一个警告upload.parseRequest(request),说Type safety: The expression of type List needs unchecked conversion to conform to List<FileItem>。如果有人也能解释这一点,那真的会帮助我完成我所做的事情。谢谢

在此处输入图像描述

4

3 回答 3

2

工厂只是一个帮手,我稍后会解释。主要工作由ServletFileUpload.

ServletFileUpload将扫描所有上传的文件(使用解析 MIME 内容并知道如何处理边界标记、内容长度等的迭代器)。

对于每个上传的文件,parse 方法要求FileItemFactory为上传的文件创建一个本地表示,然后将内容从内存(例如,从内存中保存的 HTTP POST 请求)复制到磁盘上的实际文件。

简化,过程如下:

  • 获取下一个上传的文件
  • 向工厂索要本地文件(“FileItem”)
  • 将内存中的内容(来自 HttpServletRequest)复制到本地文件(如果是 DiskFileItemFactory,则为 java.io.File)
  • 循环直到到达 HTTP 请求的末尾

有关详细信息,请参阅以下类的来源

  • org.apache.commons.fileupload.FileUploadBase.parseRequest(RequestContext)
  • org.apache.commons.fileupload.FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl

这种设计允许切换到另一个文件存储设施,例如:您可以将 DiskFileItemFactory 替换为您自己的 DatabaseFileItemFactory,因此上传的文件将存储在数据库中,而不是服务器上的本地文件中。代码更改只会影响一行,其余的 commons-fileupload 可以按原样使用(例如解析 HTTP 请求,迭代上传的文件等)

对于第二个问题:commons-fileupload 似乎与 Java 1.4 兼容,因此返回类型parseRequest() 实际上是无类型java.util.List的 - 它缺少列表仅包含 FileItem 对象的声明(例如java.util.List<FileItem>)。由于您将变量声明items为 type List<FileItem>,Java 编译器会警告您这种不匹配。

在这种情况下,您做得正确,您可以通过添加以下内容来忽略警告:

@SuppressWarnings( "unchecked" )
public static List<FileItem> parseFormRequest(HttpServletRequest request)
{
   ...
于 2012-12-06T15:51:52.190 回答
0

您需要花一些时间在文档中。

据我所知,该ServletFileUpload实例使用您提供的工厂来实际创建请求中的文件实例。您使用了将文件写入磁盘的工厂;不过还有其他选择(例如内存)。通过指定工厂,您可以指定所创建文件的类型。

你打电话时

upload.parseRequest(request)

ServletFileUpload实例通过请求数据并实际使用工厂创建它找到的文件,并将它们以列表的形式返回给您。

如果您查看parseRequest 文档,您会注意到该方法仅返回一个List. 在您的代码中,您将该返回的列表分配给List<FileItem>. 这需要强制转换,这就是您收到编译器警告的原因。

于 2012-12-06T15:34:11.240 回答
-1

我需要用于调用此函数的 java 代码...我需要用于向 HttpServletRequest 添加参数的 Servlet 代码

于 2013-12-12T06:48:09.920 回答