2013-05-19 8 views
5

Ich erstelle eine API für meine Anwendung. In der GUI-Browser-basierten Anwendung wird die Datei über eine Formularübertragung hochgeladen. Also mache ich einfach CommonsMultipartFile file = request.getFile(myfile). Die API wird jedoch einen absoluten Pfad zur Datei als Zeichenfolge bereitstellen, anstatt die Datei hochzuladen. Meine Anwendung hat Zugriff auf diesen absoluten Pfad.Wie mache ich CommonsMultipartFile vom absoluten Dateipfad?

Damit muß ich die zugrunde liegenden Methoden meiner Anwendung nicht ändern (die die gemeinsame Schnittstelle MultiPartFile Für API Zwecke akzeptieren, würde Ich mag die Datei von diesem absoluten Pfad lesen und ein CommonsMultipartFile Objekt erstellen, die übergeben werden können um zu den Methoden, die ich bereits für die GUI-Browser-basierte Anwendung verwende.

Wie kann ich das tun? Constructor zu CommonsMultipartFile akzeptiert eine FileItem

+0

Ich bin ein wenig verwirrt mit Ihrer Aussage CommonsMultipartFile file = Anfrage. (Myfile). Die Dateiupload-API gibt eine Liste von Elementen zurück. Listenelemente = fileUpload.parseRequest (request); Ist es das, worauf du dich beziehst? – Zenil

+0

@Zenil sorry, das sollte 'request.getFile ('myfile')' – Anthony

+0

sein Sie können 'RandomAccessFile' verwenden. Hier ist das Beispiel. https://opencast.jira.com/svn/MH/contrib/BigFileUploader/Upplet/src/upplet/Uploader.java –

Antwort

2

Dies ist API-spezifischen Code. also nicht die üblichen Datei-Upload-Code.

Übliche Schritte wären:

  1. Konstrukt FileItemFactory
  2. Konstrukt ServletFileUpload, es die Fabrik vorbei
  3. Anruf ServletFileUpload.parseRequest (Anfrage)

Diese Antwort ersetzt 2 & 3 mit Logik unabhängig von Servlets - es vermeidet ServletFileUpload (servlet-spezifisch) und seinen Vorgänger FileUpload (um die Dateiposition mit einem absoluten Pfadnamen zu steuern). Hinweis: (3) untersucht HTTP-Anforderungsparameter normalerweise, um Parameter auf niedrigerer Ebene zu ermitteln, die an FileItemFactory.createItem übergeben werden. Diese Parameter werden stattdessen manuell bereitgestellt und dann nur als Informationsmetadaten verwendet. Ersatz für 2 & 3:

  • FileItem konstruieren (via FileItemFactory.createItem - müssen manuell untergeordneten Parameter liefern, in der Regel über ServletFileUpload.upload bestimmt())
  • Schreiben in einer bestimmten Datei, mit einer absoluten Pfad
  • die Datei über MultipartFile lädt unter

angeforderten Code zur Verfügung gestellt. Am Ende ruft es gemeinsamen Code auf, der mit dem Servlet-Upload geteilt wird.

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

Parameter:

  • fullFilePathString: absoluter Pfad (als String) in der Datei
  • Feldname hochgeladen wird: Name des Feldes auf dem Formular

(Be verursachen ServletFileUpload & Fileupload werden nur vermieden, die folgenden werden Metadatenfelder und sind nicht zur Steuerung Verarbeitung)

  • sizeThreshhold verwendet: Speichergrößenschwelle in Bytes (normalerweise Dateien kleiner werden hochgeladen Verwendung Speicher nur und Dateien, Größere werden über die Festplatte hochgeladen - aber diese Logik hat Dateien immer über die Festplatte hochgeladen. Standard = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD.
  • repositoryBaseDireFile: in der Regel der Datei-Upload ‚Temp‘ -Verzeichnis (als Dateityp), aber diese Logik verwendet eine absolute Pfaddatei
  • content hochladen: Inhaltstyp (MIME-Typ) dem Feldes auf das Formular (null, wenn nicht mehrteiliges Formularfeld)
  • isFormField: wenn einfaches Formularfeld, 'wahr', sonst falsch, wenn mehrteiliges Feld.
  • filename: der Name der Datei - in der Regel über Form/Client angegeben.
+0

schlechtes Beispiel dude. es gibt mir keine Vorstellung davon, welche tatsächlichen Werte man in die Parameter einträgt. –

+0

Text unten hinzugefügt. Wenn ich dies umsetze, erwarte ich * immer noch, dass Sie einen Blick auf Javadocs werfen, um Params und hohes Verhalten zu verstehen. Hinweis Q ist spezifisch - hat eine vorhandene A.C.-Servlet-Datei-Upload-Lösung & Teil der API-Lösung, muss CommonsMultipartFile hinzugefügt erhalten. Das Ersetzen von Parametern durch Zahlen und Zeichenfolgen würde Ihnen wahrscheinlich weniger sagen. Wenn Sie in diesem Bereich arbeiten, ist es gängige Praxis, hier einzudringen und neue Informationen und Antworten hinzuzufügen. (BTW, freundlicher Tipp: 'Alter' könnte besser auf Instagram, Chat Rooms, etc, oder mit jemandem, den Sie kennengelernt haben, verwendet werden :-)) –

Verwandte Themen