2013-05-19 1 views
5

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

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

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

+0

Я немного смущен вашим заявлением CommonsMultipartFile file = request. (Myfile). Файл apiupupload вернет список элементов. List items = fileUpload.parseRequest (запрос); Это то, о чем вы говорите? – Zenil

+0

@ Zenil извините, это должно быть 'request.getFile ('myfile')' – Anthony

+0

Вы можете использовать 'RandomAccessFile'. Вот пример. https://opencast.jira.com/svn/MH/contrib/BigFileUploader/Upplet/src/upplet/Uploader.java –

ответ

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: имя поля на форме

(Be вызывает ServletFileUpload & FileUpload избежать, следующие становятся только поле метаданных, и не используется для управления обработкой)

  • sizeThreshhold: порогом размера памяти в байтах (обычно файлов меньше загружены с использованием только и файлы памяти более крупные загружаются с диска - но в этой логике всегда загружаются файлы с диска). По умолчанию = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD.
  • repositoryBaseDireFile: обычно загрузка файла «Темп» каталог (как тип файла), но эта логика использует абсолютный путь загрузить файл
  • CONTENTTYPE: тип содержимого (MIME тип) поля на форма (поле null, если не поле нескольких частей)
  • isFormField: если поле формы, поле «истина», другое значение false, если поле с несколькими частями.
  • fileName: имя файла - обычно указывается через форму/клиент.
+0

плохой пример чувак. это не дает мне представления о том, какие фактические значения нужно вводить в params. –

+0

Текст добавлен в нижней части. Если вы это реализуете, я все еще ожидаю, что вы заглянете в javadocs, чтобы понять параметры и поведение на высоком уровне. Замечание Q специфично - имеет предварительное решение для загрузки файлов сервлета A.C. и часть решения API, необходимо добавить CommonsMultipartFile. Замена параметров номерами и строками, вероятно, скажет вам меньше. Если вы работаете в этой области, обычной практикой является «чип» и добавление новой информации и ответов здесь. (BTW, дружелюбный совет: «чувак» может быть лучше использован на instagram, чатах и ​​т. Д. Или с кем-то, с кем вы встречались :-)) –

Смежные вопросы