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

Ant*_*ony 5 java rest spring multipart apache-commons

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

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

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

Gle*_*est 2

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

通常的步骤是:

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

这个答案用独立于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...
Run Code Online (Sandbox Code Playgroud)

参数:

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

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

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