如何从绝对文件路径制作CommonsMultipartFile?

时间:2013-05-19 15:59:18

标签: java spring rest apache-commons multipart

我正在为我的应用程序创建API。在基于GUI浏览器的应用程序中,文件通过表单提交上载。所以我只做CommonsMultipartFile file = request.getFile(myfile)。但是,API将以字符串形式提供文件的绝对路径,而不是上载文件。我的应用程序将可以访问此绝对路径。

因此我不必更改应用程序的基础方法(接受公共接口MultiPartFile。出于API目的,我想从此绝对路径读取文件并创建{{1可以传递给我已经用于基于GUI浏览器的应用程序的方法的对象。

我该怎么做? CommonsMultipartFile的构造函数接受CommonsMultipartFile

2 个答案:

答案 0 :(得分:2)

这是特定于API的代码。即不是通常的文件上传代码。

通常的步骤是:

  1. 构建FileItemFactory
  2. 构建ServletFileUpload,将其传递给工厂
  3. 调用ServletFileUpload.parseRequest(request)
  4. 这个答案取代了2& 3,逻辑独立于servlet - 它避免使用ServletFileUpload(特定于servlet)及其祖先FileUpload(以便用绝对路径名控制文件位置)。注意:(3)通常检查HTTP请求参数以确定传递给FileItemFactory.createItem的较低级别参数 - 这些参数是手动提供的,然后仅用作信息元数据。替换为2& 3:

    • 构造FileItem(通过FileItemFactory.createItem - 需要手动提供较低级别的参数,通常通过ServletFileUpload.upload()确定)
    • 使用绝对路径写入特定文件
    • 通过MultipartFile上传文件

    下面提供的请求代码。最后,它调用公共代码 - 与Servlet上传共享。

    // Initialise Apache Commons FileItemFactory for API use only
    FileItemFactory fif = new DiskFileItemFactory(sizeThreshold, repositoryBaseDirFile);
    
    // Create Apache Commons FileItem & write file at fullFilePathString into it
    FileItem fi = fif.createItem(fieldName, contentType, isFormField, fileName);
    fi.write(new java.io.File(new java.net.URI(fullFilePathString));
    
    // Convert FileItem to Spring wrapper: CommonsMultipartFile
    org.springframework.web.multipart.MultipartFile mf = new CommonsMultipartFile(fi);
    
    // From here, reuse the same code as the servlet upload.  Operate only upon  
    // Spring MultipartFile, but not ServletFileUpload, FileItemFactory etc...
    

    参数:

    • fullFilePathString :将上传文件的绝对路径(作为字符串)
    • fieldName :表单上的字段名称

    (因为避免了ServletFileUpload& FileUpload,以下只是元数据字段,不用于控制处理)

    • sizeThreshhold :内存大小阈值(以字节为单位)(通常文件较小的内容仅使用内存上传,较大的文件通过磁盘上传 - 但此逻辑文件始终通过磁盘上传)。默认值= DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD。
    • repositoryBaseDireFile 通常文件上传'temp'目录(作为文件类型),但此逻辑使用绝对路径上传文件
    • contentType :表单上字段的内容类型(MIME类型)(如果不是多部分表单字段,则为null)
    • isFormField :如果是普通表单字段,则为“true”,否则为false,如果是多部分字段。
    • fileName :文件名 - 通常通过表单/客户端指定。

答案 1 :(得分:0)

上面的 https://stackoverflow.com/a/16682983/688810 有例外:

无法调用“org.apache.commons.io.output.DeferredFileOutputStream.isInMemory()”,因为“this.dfos”为空

解决方案:java.lang.NullPointerException while creating DiskFileItem