了解工作文件上传解决方案

时间:2012-12-06 15:28:24

标签: java jsp servlets file-upload

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

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>的警告。如果有人能够解释这一点,这将真正帮助我得到我所做的。感谢

enter image description here

3 个答案:

答案 0 :(得分:2)

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

ServletFileUpload将扫描所有上传的文件(使用Iterator解析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声明为List<FileItem>类型,因此Java编译器会警告您这种不匹配。

在这种情况下,您已正确执行此操作,您可以通过添加以下内容来忽略警告:

@SuppressWarnings( "unchecked" )
public static List<FileItem> parseFormRequest(HttpServletRequest request)
{
   ...

答案 1 :(得分:0)

你需要花一些时间在documentation

从我可以收集的内容来看,ServletFileUpload实例使用您提供的工厂来实际创建请求中的文件实例。您使用了将文件写入磁盘的工厂;还有其他选择(例如记忆)。通过指定工厂,您可以指定创建的文件类型。

致电时

upload.parseRequest(request)

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

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

答案 2 :(得分:-1)

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

添加参数的Servlet代码