2016-05-13 18 views
1

I Jersey bin mit (org.glassfish.jersey - Version 2.22.2) - JAX-RS, Guice und implementierende Methode für das Hochladen von Bildern:REST-Methode für Bild Hochladen und Speichern - Inputverarbeitung Bildformat jpg, png

@PUT 
@Path("/image") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public ImageResponse putImage(@FormDataParam("image") InputStream uploadedInputStream) { 

    writeToFileWithOutputStream(uploadedInputStream); 

    return null; 
} 


private void writeToFileWithOutputStream(InputStream uploadedInputStream) { 

     try { 
      OutputStream out = new FileOutputStream(new File("xxx.jpg")); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 

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

      e.printStackTrace(); 
     } 
    } 

Wenn ich schreibe, um Datei mit Methode writeToFileWithOutputStream zu schreiben, bekomme ich Datei, die nicht als Bild geöffnet wird. Es besteht:

------WebKitFormBoundary5PVRYeRUBBAFA9yi 
Content-Disposition: form-data; name="image"; filename="images.jpg" 
Content-Type: image/jpeg 

/** image symbols **/ 

------WebKitFormBoundary5PVRYeRUBBAFA9yi 
Content-Disposition: form-data; name="" 


------WebKitFormBoundary5PVRYeRUBBAFA9yi-- 

Wenn ich die oberen 4 Zeilen manuell lösche, wird das Bild ordnungsgemäß geöffnet.

Ich habe versucht, sie mit BufferedReader/Writer zu verarbeiten, aber es ist falsch formatiert wegen Corrupted files uploaded on REST method call

Auch versucht ImageIO.read (input) zu verwenden, aber es gibt null zurück.

Was ist der beste Weg, empfangenes Bild InputStream zu verarbeiten und speichern Sie es als Bild (jpg, PNG oder anderes Format)?

Antwort

2

1. Code: Wenn mit Jersey ein Bild empfangen, erhielt der Strom kein String ist, sondern ein Inputstream, die Sie lesen könnten:

@OPTION 
@Path("/image") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response putImag_opts(

@FormDataParam("image") InputStream stream, 
@FormDataParam("image") FormDataContentDisposition fileDetail){ 
    return Response.ok().build(); 
} 

@PUT 
@Path("/image") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response putImage(

@FormDataParam("image") InputStream stream, 
@FormDataParam("image") FormDataContentDisposition fileDetail 


) { 

    writeToFileWithOutputStream(stream); 

    //if ok... 
    return Response.ok().build(); 
} 

Informationen: - Objekt stream ist die Strom empfangen, - Objekt fileDetail Dateien enthält Informationen

2. Abhängigkeiten: Bitte überprüfen Sie auch, dass Sie die richtige Abhängigkeit haben Bild hochladen:

 <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-multipart</artifactId> 
      <version>2.22.2</version> 
     </dependency> 

3. Register in Sie app Klasse

Register Inhalt mehrt in Ihrem App.class Trikot

register(MultiPartFeature.class); 
+0

Sorry, es war mein Fehler. Ich habe das Problem bei der Verwendung von InputStream. @FormDataParam ("image") FormDataContentDisposition fileDetail - Wenn ich FormDataContentDisposition nicht als Parameter verwende, fügt es InputStream zusätzliche Daten hinzu? Verarbeiten Sie InputStream vor dem Speichern als Bild? – Justas

+0

ok, die Frage ist aktualisiert und ich habe die Antwort aktualisiert. – jeorfevre

+0

Danke. Ich hatte bereits eine Jersey-Media-Multipart-Abhängigkeit verwendet. Ich kann nicht den zweiten @FormDataParam ("image") FormDataContentDisposition Parameter hinzufügen, weil ich com.sun.jersey.spi.inject.Errors $ ErrorMessagesException bekomme. Es beschrieben http://stackoverflow.com/questions/37179249/com-sun-jersey-spi-inject-errorerrormessageexception-severe-missing-depend – Justas

0

Das Problem war wegen der verschiedenen Jersey-Versionen - Version 1 in externen jar lib und Jersey 2 im Hauptprojekt. Im Hauptprojekt auf Jersey 1 umgestellt, werden Bilder jetzt ohne weitere Bearbeitung gespeichert und geöffnet. Es gibt auch keine Ausnahme, wenn 2 Argumente zusammen verwendet werden:

@FormDataParam("image") InputStream uploadedInputStream, 
@FormDataParam("image") FormDataContentDisposition fileDetail