Как проверить, полностью ли загружен файл на контроллере Spring - PullRequest
0 голосов
/ 13 июня 2018

Я использую Spring MVC в своем приложении, где у меня есть требование загрузить файл.И если размер файла превышает 30 МБ, нам нужно вызвать стороннюю службу и отправить ошибку обратно в пользовательский интерфейс.

Поскольку нам нужно вызывать другие службы после проверки размера файла, я написал код внутри Springконтроллер для проверки размера файла.Но это не дало мне ошибки, даже если размер файла больше 30 МБ.

Фрагмент кода такой, как показано ниже:

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?

1 Ответ

0 голосов
/ 16 июня 2018

Spring MultipartFile работает не так.

Spring mvc ServletDispatcher вызывает checkMultipart на раннем этапе своего 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 getParts, например, загружает файлы во временные файлы перед возвратом из этого метода, и поэтому файлы уже загружены к моменту передачи экземпляра MultipartFile вашему Contoller.

Другие серверы приложений могут вести себя по-разному, но я сомневаюсь, честно.В любом случае, вы не хотите полагаться на одно поведение.Лучше найти другое, надежное, решение.Как, например, ограничение размера загрузки файла через эту конечную точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...