Как сделать CommonsMultipartFile из абсолютного пути к файлу?

Я создаю API для моего приложения. В приложении на основе браузера с графическим интерфейсом файл загружается через отправку формы. Так что я просто делаю CommonsMultipartFile file = request.getFile(myfile), Однако API предоставит абсолютный путь к файлу в виде строки, а не загрузит файл. Мое приложение будет иметь доступ к этому абсолютному пути.

Так что мне не нужно изменять основные методы моего приложения (которые принимают общий интерфейс MultiPartFile В целях API я хотел бы прочитать файл по этому абсолютному пути и создать CommonsMultipartFile объект, который может быть передан методам, которые я уже использую для приложения на основе браузера GUI.

Как я могу это сделать? Конструктор для CommonsMultipartFile принимает FileItem

2 ответа

Это специфичный для API код. т.е. не обычный код загрузки файла.

Обычные шаги будут:

  1. построить FileItemFactory
  2. построить ServletFileUpload, передав его фабрике
  3. вызов 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

Другие вопросы по тегам