задний план
Так как его собственный проект (серверная служба Springboot) связан с редактированием документов, будет большое количество операций загрузки файлов oss, и в процессе будет загрузка больших файлов.Чтобы не влиять на опыт, внутренняя служба напрямую возвращает успех после получения файлового потока, а затем передает его дочернему потоку для асинхронного вызова службы загрузки oss.
вопрос
Поначалу тест вообще не нашел этой проблемы, и чувствовалось, что она не неизбежна. Позже, когда я проверял системный журнал при устранении других проблем, я иногда находил раздел java.io.IOException: java.io.FileNotFoundException: /home/admin/appName/.default/temp/tomcat.4504264197870423949.7001/work/Tomcat. /Localhost /ROOT/upLoad_ff92855a_13c6_49d9_bbdf_1c062fb9bfd9_00000004.tmp (нет такого файла или каталога).
проблема позиционирования
Во входном параметре внутреннего контроллера файловый поток обертывается MultipartFile. В комментариях очень ясно, что временные файлы будут очищены после завершения запроса. Поскольку мы вызываем асинхронный поток для обработки окончательной загрузки файла, когда основной поток вернется и очистит файл, он сообщит, что файла или каталога нет. В модуле автоматической настройки Springboot есть класс MultipartAutoConfiguration, который по умолчанию загружает класс StandardServletMultipartResolver в качестве метаинформации последующих bean-компонентов.При инициализации веб-подконтейнера bean-компонент StandardServletMultipartResolver инициализируется как преобразователь файлов. При обработке запроса в методе org.springframework.web.servlet.DispatcherServlet#doDispatch последний вызов checkMultipart вызовет загруженный выше преобразователь для обработки org.springframework.web.multipart.support.StandardServletMultipartResolver#resolveMultipart. Реализация заключается в том, чтобы обернуть запрос в StandardMultipartHttpServletRequest, потому что это не ленивый синтаксический анализ. Метод setMultipartFiles — это метод в AbstractMultipartHttpServletRequest, который устанавливает значение multipartFiles. После того, как метод doDispatch завершит обработку запроса из основного потока, файл будет очищен и делегирован в org.springframework.web.multipart.support.StandardServletMultipartResolver#cleanupMultipart для обработки. Как показано на рисунке, StandardMultipartHttpServletRequest является подклассом AbstractMultipartHttpServletRequest. Оценка isResolved заключается в том, имеет ли значение атрибут multipartFiles в AbstractMultipartHttpServletRequest. Приведенный выше анализ имеет значение, поэтому part.delete запускается.В этом случае при повторном получении файла асинхронным потоком будет сообщено об ошибке!