【问题标题】:How to check if file totally uploaded on Spring controller如何检查文件是否完全上传到 Spring 控制器
【发布时间】:2018-06-17 02:21:37
【问题描述】:

我在需要上传文件的应用程序中使用 Spring MVC。 如果文件大小大于 30 MB,我们需要调用其他第三方服务并将错误发送回 UI。

由于我们需要在检查文件大小后调用其他服务,所以我在 Spring 控制器中编写了代码来检查文件大小。但即使文件大小大于 30 MB,它也没有给我错误。

代码sn-p如下:

public ResponseEntity<JsonResponse> storeUploadedDocument(@RequestPart("file") MultipartFile file) throws IOException { 

    long fileSize = file.getSize();

    if (fileSize > (30 * 1024 * 1024)) {
        //File size if greater than 30 MB

        // Call thirdparty service for remaining process

        // send error code back to ui
    }

}

根据一些参考,MultipartFile.getSize() 不会返回完整的文件大小,但只会返回调用此方法时上传的文件的大小。

那么,是否可以检查文件上传过程是否已完成并检查总文件大小?

我们如何在 Spring Controller 上实现这个功能?

【问题讨论】:

标签: spring spring-mvc file-upload


【解决方案1】:

这不是 Spring MultipartFile 的工作方式。

spring mvc ServletDispatcher 在其 doDispatch 的早期调用 checkMultipart:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;

    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

    try {
        ModelAndView mv = null;
        Exception dispatchException = null;

        try {
            processedRequest = checkMultipart(request);

而checkMultipart 最终委托给request.getParts():

private void parseRequest(HttpServletRequest request) {
    try {
        Collection<Part> parts = request.getParts();

因此真正的答案是,这将取决于您的应用程序服务器如何实现对 multipart/formdata 请求的解析。

例如,Tomcat 的 getParts 实现会在从该方法返回之前将文件上传到临时文件,因此在将 MultipartFile 的实例传递给您的控制器时文件已经上传。

其他应用服务器的行为可能有所不同,但老实说,我对此表示怀疑。无论哪种方式,您都不想依赖一种行为。最好找到一个不同的、可靠的解决方案。例如,通过此端点限制文件上传的大小。

【讨论】:

  • 感谢您对 MultiPart 实现的服务器相关行为的精彩解释。最后一个选项是在 MultipartResolver 中配置最大文件上传大小。但我正在寻找其他解决方案,因此如果文件大小大于 30 MB,我可以自定义响应代码和进一步的服务调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2017-04-29
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多