2013-05-19 4 views
5

Sto creando un'API per la mia applicazione. Nell'applicazione basata sul browser della GUI il file viene caricato tramite una sottomissione del modulo. Quindi faccio semplicemente CommonsMultipartFile file = request.getFile(myfile). Tuttavia, l'API fornirà un percorso assoluto al file come stringa anziché caricare il file. La mia applicazione avrà accesso a questo percorso assoluto.Come rendere CommonsMultipartFile dal percorso file assoluto?

In modo che io non devo cambiare i metodi alla base della mia domanda (che accettano l'interfaccia comune MultiPartFile Ai fini API, vorrei leggere il file da questo percorso assoluto e creare un oggetto CommonsMultipartFile che può essere trasmesso intorno ai metodi che sto già utilizzando per l'applicazione basata su browser GUI.

Come posso fare questo? Constructor per CommonsMultipartFile accetta un FileItem

+0

Sono un po 'confuso con la tua dichiarazione CommonsMultipartFile file = request. (Myfile). Il fileupload api restituirà un elenco di elementi. Elenca elementi = fileUpload.parseRequest (richiesta); E 'questo quello a cui ti stai riferendo? – Zenil

+0

@Zenil scusate, che dovrebbe essere 'request.getFile ('myfile')' – Anthony

+0

È possibile utilizzare 'RandomAccessFile'. Ecco l'esempio. https://opencast.jira.com/svn/MH/contrib/BigFileUploader/Upplet/src/upplet/Uploader.java –

risposta

2

questo è codice specifico per API. cioè non il solito codice di caricamento dei file.

fasi usuali sarebbero:

  1. costrutto FileItemFactory
  2. costrutto ServletFileUpload, passando la fabbrica
  3. chiamata ServletFileUpload.parseRequest (richiesta)

Questa risposta sostituisce 2 & 3 con logica indipendente dai servlet - evita di utilizzare ServletFileUpload (specifico per il servlet) e il suo antenato FileUpload (in modo da controllare il percorso del file con un nome assoluto del percorso). Nota: (3) di solito esamina i parametri di richiesta HTTP per determinare i parametri di livello inferiore che vengono passati a FileItemFactory.createItem - questi parametri vengono invece forniti manualmente e quindi utilizzati solo come metadati informativi. Rimontaggio per 2 & 3:

  • costruire FileItem (via FileItemFactory.createItem - necessità di fornire manualmente i parametri di livello inferiore, solitamente determinati tramite ServletFileUpload.upload())
  • scrittura a un file specifico, con un assoluto percorso
  • caricare il file tramite MultipartFile

codice richiesto fornito di seguito. Alla fine richiama codice comune, condiviso con il caricamento di Servlet.

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

Parametri:

  • fullFilePathString: percorso assoluto (come String) dove file verranno caricati
  • nomeCampo: nome del campo del modulo

(Essere causare ServletFileUpload & FileUpload si evitano, solo i seguenti campi di metadati diventano, e non vengono utilizzati per controllare l'elaborazione)

  • sizeThreshhold: Soglia dimensione della memoria in byte (solitamente file più piccoli vengono caricati utilizzando solo e file memoria più grandi vengono caricati tramite disco - ma questa logica ha file sempre caricati via disco). Impostazione predefinita = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD.
  • repositoryBaseDireFile: solito la directory di upload file 'temp' (come un tipo di file), ma questa logica utilizza un percorso assoluto per caricare file di
  • contentType: tipo di contenuto (tipo MIME) di campo su il modulo (campo modulo null se non multiparte)
  • isFormField: se campo modulo normale, 'true', altrimenti falso se campo multiparte.
  • fileName: il nome del file, in genere specificato tramite form/client.
+0

cattivo esempio. non mi dà un'idea di quali valori effettivi inserire nei parametri. –

+0

Testo aggiunto in fondo. Se si implementa questo, io * ancora * mi aspetto di dare un'occhiata a javadocs per capire i parametri e il comportamento ad alto livello. Nota Q è specifico - ha pre-esistente soluzione di upload del file servlet A.C. e parte della soluzione API, ha bisogno di ottenere CommonsMultipartFile aggiunto. Sostituire param con numeri e stringhe probabilmente ti direbbe di meno. Se lavori in quest'area, la pratica comune è quella di "integrare" e aggiungere nuove informazioni e risposte qui. (A proposito, suggerimento amichevole: "amico" potrebbe essere usato meglio su instagram, chat room, ecc., O con qualcuno che hai incontrato :-)) –