2013-02-13 9 views
7

Seit einiger Zeit entwickle ich JAX-RS Webservices für meine Entwicklungsbedürfnisse. Alle Methoden, die ich bisher geschrieben habe, akzeptieren java Strings oder primitive Typen als Eingabe.JAX-RS Bilder als Eingabe akzeptieren

Ein Beispiel eines solchen Verfahrens:

@POST 
@Path("MyMethod") 
@Produces(MediaType.APPLICATION_JSON) 
public String MyMethod(@FormParam("username")String username, @FormParam("password")String passowrd) 

Was ich versuche jetzt zu tun ist, Bilder als Eingabe akzeptieren. Ich habe viele Artikel dazu gelesen. Einige schlugen vor, die base64-Codierung als Eingabe zu akzeptieren, und andere schlugen vor, ein tatsächliches InputSteam zu akzeptieren.

Allerdings habe ich noch ein vollständiges Beispiel, wie man einen InputStream akzeptiert. Ich lese über die @consumer Annotation und @Provider, aber ich kann mich immer noch nicht darum kümmern. Gibt es einen Artikel, eine Dokumentation oder ein Beispiel, das mich irgendwie dazu führt? Ein Schritt für Schritt-Prozess, wie die Theorie implementiert und nicht angezeigt wird.

Ich weiß, dass die Base64-Codierung funktioniert, aber aus Neugier möchte ich wissen, wie der andere Ansatz auch funktioniert ... Vielen Dank im Voraus.

Antwort

7

Dies sollte funktionieren:

import org.apache.commons.io.IOUtils; 
@POST 
@Path("MyMethod") 
@Consumes("*/*") // to accept all input types 
public String MyMethod(InputStream stream) { 
    byte[] image = IOUtils.toByteArray(stream); 
    return "done"; 
} 
+0

Ich habe den obigen Code nicht versucht, aber was, wenn ich mehr als einen Parameter haben möchte? Eine Reihe von Strings und primitiven Typen UND ein InputStream? Auch wenn ich alle Arten von Bildern unterstützen möchte? – Brams

+1

Wie soll Ihr HTTP POST-Anfragetext aussehen? – yegor256

+0

yegor256, ich bin mir nicht sicher, ob ich deine Frage verstehe. Meinst du, wie ich meinen Anfragekörper aufbauen werde? – Brams

4

Hier ist die Upload-Beispiel:

@POST 
@Path("/fileupload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces("text/plain") 
public String handleUpload(@FormDataParam("file") InputStream in, 
          @FormDataParam("file") FormDataContentDisposition fileDetail) throws Exception { 

    if(fileDetail==null || fileDetail.getFileName()==null) { 
     return "No filename"; 
    } 
    System.out.println("Receiving file "+fileDetail.getFileName()); 
    File f = new File(fileDetail.getFileName()); 
    long ts = System.currentTimeMillis(); 
    FileOutputStream out = new FileOutputStream(f); 

    byte[] buf = new byte[16384]; 
    int len = in.read(buf); 
    while(len!=-1) { 
     out.write(buf,0,len); 
     len = in.read(buf); 
    } 
    out.close(); 
    System.out.println("Received file "+f.getName()+" in "+(System.currentTimeMillis()-ts)/1000+"s"); 
    return "File "+f.getName()+" received\n"; 
} 

Es ist (schamlos) aus dieser example on github kopiert

Beachten Sie, dass Sie eine POST whith akzeptieren müssen MULTIPART_FORM_DATA Codierung, wo das Formular, das den Beitrag behandelt, wie folgt ist:

<form action="resource/fileupload" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" /> 
    <input type="submit" value="Upload" /> 
</form> 
+0

Vielen Dank für Ihre Antwort. Wenn ich dieses Tool verwende: http://code.google.com/p/gtm-oauth/ als meinen Rest-Client, dann wäre ich nicht in der Lage, ein normales HTML-Formular zu verwenden, um meine Ruheanforderung zu übermitteln. Weißt du, wie ich mit diesem Toolkit einen Eingabestream senden kann? – Brams

+0

Ich bin kein Experte für Apple-Programmierung, aber vielleicht [diesen Beitrag] (https://groups.google.com/forum/?fromgroups=#!topic/tumblr-api/ghFPbuaPxho) ist, was Sie suchen –

Verwandte Themen