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

标签 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

最佳答案

工厂只是一个 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/

相关文章:

java - HttpServlet 响应。有没有办法在不使用 response.setHeader 的情况下使 cookie 安全和/或仅限 http

tomcat - Grails ConfigSlurper 内存泄漏

java - Jetlang PoolFiber 示例

java - JAVA中多线程的全局求和错误

java - 非 servlet 从 web.xml 获取属性

java - jSTL中循环内的方法

java - 是否可以将 ArrayList 索引作为列表键存储到 Struts 2 选择框中?

java - HibernateJPAVendorAdapter 和 JPAProperty 中的属性之间的优先级

java - 执行jar文件: Caused by: java. lang.ClassNotFoundException : org. springframework.context.ApplicationContext

JSP - 使用 Apache Commons 上传文件