我编写了下面的方法,由我的 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>
。如果有人也能解释这一点,那将真正帮助我得到我所做的事情。谢谢
最佳答案
工厂只是一个 helper ,稍后我会解释。主要工作由ServletFileUpload
完成.
ServletFileUpload
将扫描所有上传的文件(使用迭代器解析 MIME 内容并知道如何处理边界标记、内容长度等)。
对于每个上传的文件,解析方法会询问 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)
{
...
关于java - 了解工作文件上传解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746928/