首页 > 解决方案 > 如何检查文件是否完全上传到 Spring 控制器

问题描述

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

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

代码片段如下:

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 上实现此功能?

标签: springspring-mvcfile-upload

解决方案


这不是 Spring 的MultipartFile工作方式。

spring mvc ServletDispatchercheckMultipart在其 doDispatch 的早期调用:

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 的实现会在从该方法返回之前将文件上传到临时文件,因此在将实例传递给您的 ContollergetParts时文件已经上传。MultipartFile

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


推荐阅读