2013-05-19 20 views
5

Tworzę interfejs API dla mojej aplikacji. W aplikacji opartej na przeglądarce GUI plik jest przesyłany za pośrednictwem formularza. Więc po prostu robię CommonsMultipartFile file = request.getFile(myfile). Jednak interfejs API zapewni bezwzględną ścieżkę do pliku w postaci ciągu znaków, zamiast przesyłania pliku. Moja aplikacja będzie miała dostęp do tej absolutnej ścieżki.Jak zrobić plik CommonsMultipartFile z bezwzględnej ścieżki do pliku?

Tak, że nie mam do zmiany metod leżących u podstaw mojej aplikacji (które akceptują wspólny interfejs MultiPartFile Dla celów API, chciałbym przeczytać plik z tej ścieżki bezwzględnej i stworzyć CommonsMultipartFile przedmiot, który może zostać przekazany dokoła do metod, które mam już korzystających z aplikacji opartych przeglądarki GUI.

Jak mogę to zrobić? Konstruktor do CommonsMultipartFile akceptuje FileItem

+0

Jestem trochę zdezorientowany twoim stwierdzeniem: CommonsMultipartFile file = request. (Myfile). Interfejs API Fileupload zwróci listę elementów. List items = fileUpload.parseRequest (request); Czy to właśnie masz na myśli? – Zenil

+0

@Zenil przepraszam, to powinno być 'request.getFile ('myfile')' – Anthony

+0

Możesz użyć 'RandomAccessFile'. Oto przykład. https://opencast.jira.com/svn/MH/contrib/BigFileUploader/Upplet/src/upplet/Uploader.java –

Odpowiedz

2

jest to kod API specyficznych tzn. nie zwykły kod wysyłania plików.

Zwykłe kroki byłoby:

  1. konstrukt FileItemFactory
  2. konstruktu ServletFileUpload, przekazując mu fabrykę
  3. wezwanie ServletFileUpload.parseRequest (request)

Ta odpowiedź zastępuje 2 & 3 z logiką niezależny od serwletów - unika używania ServletFileUpload (specyficznego dla serwletu) i swojego przodka FileUpload (aby kontrolować lokalizację pliku za pomocą bezwzględnej nazwy ścieżki). Uwaga: (3) zazwyczaj sprawdza parametry żądania HTTP w celu określenia parametrów niższego poziomu, które są przekazywane do FileItemFactory.createItem - te parametry są zamiast tego podawane ręcznie, a następnie używane tylko jako metadane informacyjne. Zamiennik 2 & 3:

  • skonstruować FileItem (przez FileItemFactory.createItem - konieczność ręcznego wprowadzenia parametrów niższym poziomie, zazwyczaj metodą ServletFileUpload.upload())
  • zapisu w określonym pliku bezwzględną ścieżka
  • przesłać plik za pomocą MultipartFile

Zamówiony kod podany poniżej. Na końcu wywołuje wspólny kod - udostępniany wraz z przesłaniem serwletu.

// 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... 

Parametry:

  • fullFilePathString: absolutny ścieżki (string), w którym plik zostanie przekazany
  • fieldName: Nazwa pola w postaci

(Be spowodować ServletFileUpload & FileUpload unika Poniższe wymogi stosuje się tylko pola metadanych, i nie są wykorzystywane do kontroli przetwarzania)

  • sizeThreshhold: pamięci próg rozmiar w bajtach (zwykle pliki mniejsze są przesyłane przy użyciu tylko i pliki pamięci większe są przesyłane za pośrednictwem dysku - ale ta logika ma zawsze pliki przesyłane za pośrednictwem dysku). Domyślnie = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD.
  • repositoryBaseDireFile: zwykle przesyłanie plików katalogu 'temp' (jako typ pliku), ale ta logika wykorzystuje ścieżkę bezwzględną do File Upload
  • contentType: typ zawartości (typu MIME) pola na formularz (pusty, jeśli nie wieloczęściowy obszar formularza)
  • isFormField: jeśli zwykłe pole formularza, "prawda", w przeciwnym razie fałsz, jeśli pole składa się z wielu części.
  • nazwa_pliku: nazwa pliku - zwykle określona za pomocą formularza/klienta.
+0

zły przykład koleś. nie daje mi pojęcia, jakie wartości rzeczywiste wprowadzić w parametrach. –

+0

Tekst dodany u dołu. Wdrażając to, * wciąż * oczekuję, że spojrzysz na javadocs, aby zrozumieć params i zachowanie wysokiego poziomu. Uwaga: Q jest specyficzne - ma wcześniej dostępne rozwiązanie przesyłania plików serwletu A.C. i część rozwiązania API, aby uzyskać plik CommonsMultipartFile. Zastąpienie params liczbami i łańcuchami prawdopodobnie powiedziałoby ci mniej. Jeśli pracujesz w tym obszarze, powszechną praktyką jest "chipowanie" i dodawanie nowych informacji i odpowiedzi tutaj. (BTW, przyjacielska wskazówka: "koleś" może być lepiej wykorzystany na instagramie, w pokojach rozmów itp. Lub z kimś, kogo spotkałeś :-)) –

Powiązane problemy