我编写了下面的方法,我的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>
的警告。如果有人能够解释这一点,这将真正帮助我得到我所做的。感谢
答案 0 :(得分:2)
工厂只是一个帮手,我稍后会解释。主要工作由ServletFileUpload
完成。
ServletFileUpload
将扫描所有上传的文件(使用Iterator解析MIME内容并知道如何处理边界标记,内容长度等。)
对于每个上传的文件,parse方法要求FileItemFactory
为上传的文件创建本地表示,然后从内存中复制内容(例如,从内存中保存的HTTP POST请求)到内容。磁盘上的实际文件。
简化,程序如下:
有关详细信息,请参阅以下类的来源
此设计允许切换到另一个存储设施以获取文件,例如: 您可以将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代码