如何获取部分多部分Servlet 3.0请求写出的文件路径?

And*_*j H 5 java multipartform-data spring-mvc servlet-3.0

我正在编写Spring MVC控制器,它将接受多部分文件上传(从HTML表单上传文件的标准方法).

Servlet 3.0规范引入了servlet容器处理multipart/form-data的标准方法,引入了MultipartConfigElement用于配置和Part接口,Spring MVC与它们集成,没有任何问题.

问题:我希望获得通过Part.write()方法输出的文件的完整路径,跳过不必要的InputStream读取.由于文件大小的原因,上传到我的控制器的文件最有可能最终由servlet容器输出到磁盘的临时文件,因此Part.write()会将文件移动到目标名称而不是滥用RAM资源.根据规范,该文件是相对于配置的多部分位置编写的.

我想出的解决方案是这样的:

@RestController
@RequestMapping("/upload")
public class UploadController {
    @Autowired
    private MultipartConfigElement multipartConfigElement;

    @RequestMapping(value = "/{uploadId}", method = RequestMethod.POST)
    public String handleMultipartFileUpload(
            @PathVariable String uploadId,
            @RequestParam("file") List<Part> files) throws IOException {
        for (Part uploadedPart : files) {
            String temporaryFileName = UUID.randomUUID().toString();

            uploadedPart.write(temporaryFileName);

            // CODE-SMELL FOLLOWS:
            Path temporaryFilePath = FileSystems.getDefault().getPath(
                    multipartConfigElement.getLocation()).resolve(temporaryFileName);
        }

        return "handleMultipartFileUpload";
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码气味评论就是这样:代码味道.我使用autowired创建了写入文件的路径MultipartConfigElement,Spring恰好将其作为bean.问题是:

  1. 有没有更好的方法来获取文件的写入位置?
  2. 那些不使用Spring而且无法访问注入MultipartConfigElementbean的应用程序怎么样?