2014-10-13 13 views
9

Sto utilizzando il provider multiparte di jboss per l'importazione di un file. Leggo qui http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation riguardo a @MultipartForm perché posso mapparlo esattamente con il mio POJO.@MultipartForm Come ottenere il nome del file originale?

Qui di seguito è il mio POJO

public class SoftwarePackageForm { 

    @FormParam("softwarePackage") 
    private File file; 

    private String contentDisposition; 

    public File getFile() { 
     return file; 
    } 

    public void setFile(File file) { 
     this.file = file; 
    } 

    public String getContentDisposition() { 
     return contentDisposition; 
    } 

    public void setContentDisposition(String contentDisposition) { 
     this.contentDisposition = contentDisposition; 
    } 
} 

Poi ho ricevuto l'oggetto file e stampato il suo percorso assoluto ed è tornato un nome di file di tipo di file. L'estensione e il nome del file caricato vengono persi. Il mio cliente sta cercando di caricare un file di archivio (zip, tar, z)

Ho bisogno di queste informazioni sul lato server in modo da poter applicare correttamente il programma di annullamento dell'archiviazione.

Il nome file originale viene inviato al server nell'intestazione content-disposition.

Come posso ottenere questa informazione? Oppure come posso dire jboss per salvare il file con il nome e l'estensione del file caricato? È configurabile dalla mia applicazione?

+0

Puoi provare ad aggiungere '@PartType (" application/zip ")' al tuo 'file' e vedere se funziona? Il pacchetto completo è 'org.jboss.resteasy.annotations.providers.multipart.PartType'. –

+0

@isim Sì, ci proverò. Quale sarà il valore per i file tar e Z? –

+0

@isim Non usare :(Non ha funzionato, non capisco perché le persone avvolgono gli apis quando non forniscono tutte le funzionalità fornite dall'apis originale. Dicono che qualcosa può essere fatto meglio, forniscono apis, introducono di più problemi e nel momento in cui veniamo a conoscenza di questo, siamo bloccati, sto lavorando su questo da quasi 3 giorni e mi sono stufato –

risposta

10

Dopo aver guardato un po 'per esempi Resteasy incluso questo one, sembra che non sia possibile recuperare il nome file originale e le informazioni di estensione quando si utilizza una classe POJO con l'annotazione @MultipartForm.

Gli esempi che ho visto finora recuperare il nome del file dalla testata Content-Disposition dalla parte "file" dei multiparts presentate formare dati tramite HTTP POST, che in sostanza, sembra qualcosa di simile:

Content-Disposition: form-data; name="file"; filename="your_file.zip" 
Content-Type: application/zip 

Avrete necessario aggiornare il file di classe servizio di upload REST per estrarre questa intestazione come questo:

@POST 
@Path("/upload") 
@Consumes("multipart/form-data") 
public Response uploadFile(MultipartFormDataInput input) { 

    String fileName = ""; 
    Map<String, List<InputPart>> formParts = input.getFormDataMap(); 

    List<InputPart> inPart = formParts.get("file"); // "file" should match the name attribute of your HTML file input 
    for (InputPart inputPart : inPart) { 
    try { 
     // Retrieve headers, read the Content-Disposition header to obtain the original name of the file 
     MultivaluedMap<String, String> headers = inputPart.getHeaders(); 
     String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";"); 
     for (String name : contentDispositionHeader) { 
     if ((name.trim().startsWith("filename"))) { 
      String[] tmp = name.split("="); 
      fileName = tmp[1].trim().replaceAll("\"","");   
     } 
     } 

     // Handle the body of that part with an InputStream 
     InputStream istream = inputPart.getBody(InputStream.class,null); 

     /* ..etc.. */ 
     } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    String msgOutput = "Successfully uploaded file " + filename; 
    return Response.status(200).entity(msgOutput).build(); 
} 

Spero che questo aiuti.

+0

Sì, sono tornato a questo approccio.Ho anche sollevato un problema nel loro forum : //issues.jboss.org/browse/RESTEASY-1115 Grazie per i tuoi sforzi. –

+0

Sembra buono. Prenderesti in considerazione la possibilità di contrassegnare questa risposta come accettata? :) Grazie. –

2

È possibile utilizzare @PartFilename ma sfortunatamente questo è attualmente utilizzato solo per la scrittura di moduli, non per la lettura di moduli: RESTEASY-1069.

Finché questo problema è stato risolto, è possibile utilizzare MultipartFormDataInput come parametro per il metodo di risorsa.

0

Sembra che Isim abbia ragione, ma c'è una soluzione alternativa.

Creare un campo nascosto nel modulo e aggiornarne il valore con il nome del file selezionato. Quando il modulo viene inviato, il nome file verrà inviato come @FormParam.

Ecco un codice che potrebbe essere necessario (jquery richiesto).

<input id="the-file" type="file" name="file"> 
<input id="the-filename" type="hidden" name="filename"> 

<script> 
$('#the-file').on('change', function(e) { 
    var filename = $(this).val(); 
    var lastIndex = filename.lastIndexOf('\\'); 
    if (lastIndex < 0) { 
     lastIndex = filename.lastIndexOf('/'); 
    } 
    if (lastIndex >= 0) { 
     filename = filename.substring(lastIndex + 1); 
    } 
    $('#the-filename').val(filename); 
}); 
</script>