2013-04-15 1 views
1

J'essaie de télécharger un fichier sur le Web en utilisant le service Web de repos. j'ai créé un flux qui accepte un fichier sous la forme que:Comment utiliser le fichier temporaire à partir duquel je reçois inputStream

@POST 
@Path("/upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(

     @FormDataParam("file") InputStream uploadInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetails, 
     @FormDataParam("location") String uploadedFileLoc ) { 
     . 
     . 
} 

ici à la fin de la méthode, je dois retourner le dossier qui client téléchargé et dans la méthode suivante que le fichier est converti en tableau d'octets. Fondamentalement, je reçois le fichier dans un format "InputStream". Y at-il un moyen que je pourrais obtenir en tant que fichier lui-même?

+0

Que voulez-vous dire par 'un fichier lui-même'? Quel est exactement ce que vous essayez de faire? –

+0

le flux est conçu en studio mule. le composant "fichier à Byte Array Transformer" fichier à transformer, pour lequel nous devons envoyer le fichier à travers la classe ci-dessus - en acceptant par le biais du client. –

+0

Je pense que si vous voulez renvoyer un objet File à cet autre "File to Byte Array Transformer", vous devrez écrire InputStream dans un fichier, puis envoyer le fichier. –

Répondre

0

Merci à tous pour votre suggestion. La principale chose que je dois faire est de convertir le fichier en tableau d'octets. Depuis que je reçois l'InputStream, je pourrais passer cela comme le retour au flux suivant plutôt que d'attendre le fichier lui-même. Dans le flux suivant plutôt que d'utiliser un transformateur "file to byte array", il suffit d'utiliser le transformateur "Object to byte array". Finalement cela fonctionne.

+0

'@ raviKumar' Voir ma réponse cela peut vous aider! – HybrisFreelance

0

Vous pouvez utiliser l'API Jersey REST pour le téléchargement de fichiers. Par exemple,

@Path("/upload") 
public class FileUploadService{ 
     @POST 

@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream, 
    @FormDataParam("file") FormDataContentDisposition fileDetail) { 

     String location = "/" + fileDetail.getFileName(); 

    // save it 
    writeToFile(uploadedInputStream, location); 

    String output = "File uploaded to : " + location; 

    return Response.status(200).entity(output).build(); 

     } 

} 

Et pour enregistrer le fichier que vous avez cette méthode:

private void writeToFile(InputStream uploadedInputStream, 
    String location) { 

    try { 
     OutputStream out = new FileOutputStream(new File(
       location)); 
     int read = 0; 
     byte[] bytes = new byte[1024]; 

     out = new FileOutputStream(new File(location)); 
     while ((read = uploadedInputStream.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 
     out.flush(); 
     out.close(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

} 

Hope it helps!

1

@Ravi Kumar

Vous pouvez utiliser

public Response uploadFileSimple(@FormDataParam("file") File file, @FormDataParam("file") FormDataContentDisposition formData) 

Il vous renvoie un objet fichier directement, mais jersey elle-même créer un objet de fichier dans temp pour vous, vous pouvez donc dire qu'il ya deux fichiers temp avec la même Taille.

First MIMExxxxx.tmp from where you get you input steam 

Second re234xxxx from which you get this file object 

NOTE : Avant d'appeler prendre votre maillot de méthode de ressource temps pour créer ce fichier deux (selon la taille du fichier).

Et si vous souhaitez utiliser directement le fichier MIMExx.tmp, alors je ne pense pas qu'il existe une façon simple, vous pouvez utiliser JAVA REFLECTION pour obtenir le chemin du fichier temporaire et l'utilisation.

Utilisation de Java Réflexion:

@Path("/upload/{parentfolderid}") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFileWithPart(FormDataMultiPart form) 
    { 

     try 
     { 
      FormDataBodyPart filePart = form.getField("upload"); 
      BodyPartEntity bodyPart = (BodyPartEntity) filePart.getEntity(); 

      MIMEPart mimePart = (MIMEPart) readFieldValue("mimePart", bodyPart); 
      Object dataHead = readFieldValue("dataHead", mimePart); 
      Object dataFile = readFieldValue("dataFile", dataHead); 
      File tempFile = null; 
      if (dataFile != null) 
      { 
       Object weakDataFile = readFieldValue("weak", dataFile); 
       tempFile = (File) readFieldValue("file", weakDataFile); 
      } 
      else 
      { 
       tempFile = filePart.getValueAs(File.class); 
      } 

    // Here is your *tempFile*, Do what ever you want with it 
} 

private static Object readFieldValue(String fieldName, Object o) throws Exception 
{ 
    Field field = o.getClass().getDeclaredField(fieldName); 
    field.setAccessible(true); 
    return field.get(o); 
} 
Questions connexes