java - 如何从绝对文件路径创建 CommonsMultipartFile?

标签 java spring rest apache-commons multipart

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

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

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

最佳答案

这是特定于 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上传文件

下面提供了请求的代码。最后它调用公共(public)代码 - 与 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:通常文件上传“临时”目录(作为文件类型),但此逻辑使用绝对路径上传文件
  • contentType:表单字段的内容类型(MIME 类型)(如果不是多部分表单字段则为 null)
  • isFormField:如果是普通表单字段,则为“true”,否则如果是多部分字段,则为 false。
  • fileName:文件的名称 - 通常通过表单/客户端指定。

关于java - 如何从绝对文件路径创建 CommonsMultipartFile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636582/

相关文章:

Java:最好将实体中的列表初始化为空列表或空列表

java - Docker + JHipster + 内存使用量上升

java - 无法在自定义 Spring Boot 启动器中使用 WebSecurityConfigurerAdapter

rest - 如何销毁 MockRestServiceServer?

security - 任何 Spring Framework 对 REST 安全性的支持?

java - 如何从以编程方式膨胀的布局中访问 View ?

java - 在 Java 中检查非空

javascript - app android - 外部资源实现

java - 非静态字段初始化

java - hibernate ogm mongo db,如何获取集合计数?