5

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

这样我就不必更改我的应用程序的底层方法(它们接受公共接口MultiPartFile出于 API 目的,我想从这个绝对路径读取文件并创建一个CommonsMultipartFile可以传递给我的方法的对象我已经在使用基于 GUI 浏览器的应用程序。

我怎样才能做到这一点?构造函数CommonsMultipartFile接受一个FileItem

4

2 回答 2

2

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

通常的步骤是:

  1. 构造 FileItemFactory
  2. 构造 ServletFileUpload,将其传递给工厂
  3. 调用 ServletFileUpload.parseRequest(request)

此答案用独立于 servlet 的逻辑替换 2 和 3 - 它避免使用 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 : 文件名 - 通常通过表单/客户端指定。
于 2013-05-22T03:25:09.820 回答
0

以上https://stackoverflow.com/a/16682983/688810有异常:

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

解决方案:创建 DiskFileItem 时出现 java.lang.NullPointerException

于 2021-02-23T05:07:40.947 回答