【问题标题】:How to make CommonsMultipartFile from absolute file path?如何从绝对文件路径制作 CommonsMultipartFile?
【发布时间】:2013-05-19 15:59:17
【问题描述】:

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

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

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

【问题讨论】:

  • 我对您的声明 CommonsMultipartFile file = request.(myfile) 有点困惑。 fileupload api 将返回一个项目列表。列表项 = fileUpload.parseRequest(request);你指的是这个吗?
  • @Zenil 抱歉,应该是 request.getFile('myfile')
  • 您可以使用RandomAccessFile。这是示例。 opencast.jira.com/svn/MH/contrib/BigFileUploader/Upplet/src/…

标签: java spring rest apache-commons multipart


【解决方案1】:

这是特定于 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:文件的名称 - 通常通过表单/客户端指定。

【讨论】:

  • 坏榜样老兄。它让我不知道在参数中放入什么实际值。
  • 文本添加在底部。如果实现这一点,我仍然希望您浏览一下 javadocs 以了解参数和高级行为。注Q具体-已有A.C. servlet文件上传解决方案&部分API解决方案,需要获取CommonsMultipartFile添加。用数字和字符串替换参数可能会告诉你更少。如果您在该领域工作,通常的做法是“加入”并在此处添加新信息和答案。 (顺便说一句,友情提示:“dude”可能更适合用于 Instagram、聊天室等,或者与您认识的人一起使用 :-))
【解决方案2】:

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

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

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

【讨论】:

猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2011-02-26
  • 2010-09-21
  • 2014-03-16
相关资源
最近更新 更多