Как сделать CommonsMultipartFile из абсолютного пути к файлу?
Я создаю API для моего приложения. В приложении на основе браузера с графическим интерфейсом файл загружается через отправку формы. Так что я просто делаю CommonsMultipartFile file = request.getFile(myfile)
, Однако API предоставит абсолютный путь к файлу в виде строки, а не загрузит файл. Мое приложение будет иметь доступ к этому абсолютному пути.
Так что мне не нужно изменять основные методы моего приложения (которые принимают общий интерфейс MultiPartFile
В целях API я хотел бы прочитать файл по этому абсолютному пути и создать CommonsMultipartFile
объект, который может быть передан методам, которые я уже использую для приложения на основе браузера GUI.
Как я могу это сделать? Конструктор для CommonsMultipartFile
принимает FileItem
2 ответа
Это специфичный для API код. т.е. не обычный код загрузки файла.
Обычные шаги будут:
- построить FileItemFactory
- построить ServletFileUpload, передав его фабрике
- вызов ServletFileUpload.parseRequest(запрос)
Этот ответ заменяет 2 и 3 на логику, независимую от сервлетов - он избегает использования ServletFileUpload (специфичного для сервлета) и его предка FileUpload (чтобы управлять расположением файла с помощью абсолютного имени пути). Примечание: (3) обычно проверяет параметры HTTP-запроса для определения параметров более низкого уровня, которые передаются в FileItemFactory.createItem - вместо этого эти параметры предоставляются вручную, а затем используются только в качестве информационных метаданных. Замена для 2 и 3:
- создать FileItem (через FileItemFactory.createItem - необходимо вручную предоставить параметры более низкого уровня, обычно определяемые с помощью ServletFileUpload.upload())
- записать в определенный файл с абсолютным путем
- загрузить файл через MultipartFile
Запрашиваемый код указан ниже. В конце он вызывает общий код - общий доступ к загрузке сервлета.
// Initialise Apache Commons FileItemFactory for API use only
FileItemFactory fif = new DiskFileItemFactory(sizeThreshold, repositoryBaseDirFile);
// Create Apache Commons FileItem & write file at fullFilePathString into it
FileItem fi = fif.createItem(fieldName, contentType, isFormField, fileName);
fi.write(new java.io.File(new java.net.URI(fullFilePathString));
// Convert FileItem to Spring wrapper: CommonsMultipartFile
org.springframework.web.multipart.MultipartFile mf = new CommonsMultipartFile(fi);
// From here, reuse the same code as the servlet upload. Operate only upon
// Spring MultipartFile, but not ServletFileUpload, FileItemFactory etc...
Параметры:
- fullFilePathString: абсолютный путь (в виде строки), куда будет загружен файл
- fieldName: имя поля в форме
(Поскольку исключаются ServletFileUpload & FileUpload, следующие становятся только полями метаданных и не используются для управления обработкой)
- sizeThreshhold: порог размера памяти в байтах (обычно файлы меньшего размера загружаются с использованием только памяти, а файлы большего размера загружаются с диска - но в этой логике файлы всегда загружаются с диска). По умолчанию = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD.
- repositoryBaseDireFile: обычно папка загрузки файла 'temp' (как тип файла), но эта логика использует абсолютный путь для загрузки файла
- contentType: тип содержимого (MIME-тип) поля в форме (пустое, если не многочастное поле формы)
- isFormField: если поле простой формы, 'true', иначе false, если поле состоит из нескольких частей.
- fileName: имя файла - обычно указывается через форму / клиент.
у приведенного выше /questions/30387719/kak-sdelat-commonsmultipartfile-iz-absolyutnogo-puti-k-fajlu/30387731#30387731 есть исключение:
Невозможно вызвать org.apache.commons.io.output.DeferredFileOutputStream.isInMemory(), потому что this.dfos имеет значение null
решение: java.lang.NullPointerException при создании DiskFileItem