2014-09-09 5 views
2

J'ai besoin d'aide pour télécharger plusieurs fichiers en utilisant Jersey. J'ai utilisé le code suivant pour télécharger un seul fichier en utilisant Jersey.Sélection de plusieurs fichiers et téléchargement à l'aide de Jersey

package my.first.rest; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 



import com.sun.jersey.core.header.FormDataContentDisposition; 
import com.sun.jersey.multipart.FormDataParam; 

@Path("uploadfile") 
public class Upload { 
String location; 



    @POST 
    @Path("/upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    public String uploadfile(@FormDataParam("file") InputStream is, @FormDataParam("file") FormDataContentDisposition filedetail){ 



     saveToDisk(is,filedetail); 
     return "File Uploaded Succesfully_"+location; 

    } 


    private void saveToDisk(InputStream is1, 
      FormDataContentDisposition filedetail) { 
     // TODO Auto-generated method stub 

     location = "E://upload/"+filedetail.getFileName(); 
     try{ 
      OutputStream out = new FileOutputStream(new File(location)); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 
      out = new FileOutputStream (new File(location)); 
      while((read = is1.read(bytes)) != -1){ 
       out.write(bytes,0,read); 
      } 
      out.flush(); 

      out.close(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 


} 

Le code ci-dessus fonctionne bien avec le téléchargement d'un seul fichier, mais quand j'ajoute multiple = attribut « multiple » du type d'entrée = balise de fichier, je suis en mesure de sélectionner plusieurs éléments dans un seul téléchargement, il télécharge le premier élément sélectionné et le nom du dernier élément sélectionné. Je ne m'attends pas à ce que le code fonctionne, car il n'était pas destiné à gérer plusieurs téléchargements de fichiers, mais il doit y avoir un moyen de contourner le problème, n'est-ce pas? Depuis, il prend un fichier et le nom d'un autre.

J'ai regardé de multiples threads de stackoverflow et beaucoup de googled. Je n'aurais pas posté ceci si j'avais trouvé la réponse. Je ne cherche pas pour télécharger plusieurs fichiers en utilisant les types de code ci-dessous:

<input type ="file" name="file"> 
<input type ="file" name="file"> 
<input type ="file" name="file2"> 

Je ne veux pas de télécharger plusieurs fichiers individuellement. Je veux être en mesure de sélectionner plusieurs fichiers à la fois et tous d'être téléchargés quelque part. Mon tag est comme ceci:

<input type ="file" name="file" multiple="multiple"> 

Voici l'intégralité du code HTML.

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="ISO-8859-1"> 
<title>Insert title here</title> 
</head> 
<body> 
<form action ="http://localhost:8080/fuseframework/uploadfile/upload" method="post" enctype="multipart/form-data"> 
file: 
<br> 
<input type ="file" name="file" multiple="multiple"> 

<input type="submit" value="send"> 
</form> 
</body> 
</html> 

Ce sont les pots que j'ai utilisé http://i.stack.imgur.com/1tVT8.png

Répondre

6

Il fonctionne bien pour moi d'utiliser le « FormDataMultiPart ».

Voici le code Java, l'objet FormDataContentDisposition (formParams) contient le contenu réel du fichier.

List<FormDataBodyPart> parts = formParams.getFields("file"); 
for (FormDataBodyPart part : parts) { 
    FormDataContentDisposition file = part.getFormDataContentDisposition(); 
} 

Du côté JS, j'utilise l'objet FormData et pousser plusieurs fichiers avec le même nom:

for (var i = 0; i < files.length; i++) 
    fd.append('file', files[i]); 

le souhaitent vous aidera

+0

Un bon ......... –

+0

Pour obtenir l'utilisation du contenu du fichier: InputStream is = bodyPart.getEntityAs (InputStream.class); – Gab

+0

lorsque j'essaie de passer inputStream en tant qu'argument, j'obtiens une exception d'exécution, il est dit que "DataHead $ ReadMultiStream" n'est pas sérialisable. une idée? –

3

Cette chose a fonctionné pour moi assez bien:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public void uploadMultiple(@FormDataParam("file") FormDataBodyPart body){ 
    for(BodyPart part : body.getParent().getBodyParts()){ 
     InputStream is = part.getEntityAs(InputStream.class); 
     ContentDisposition meta = part.getContentDisposition(); 
     doUpload(is, meta); 
    } 
} 
Questions connexes