2013-02-13 16 views
7

Od dłuższego czasu rozwijam usługi internetowe JAX-RS dla moich potrzeb rozwojowych. Wszystkie metody, które do tej pory napisałem, akceptują ciągi java lub typy pierwotne jako dane wejściowe.JAX-RS Akceptuj obrazy jako dane wejściowe

Przykładem takiej metody:

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

Co staram się zrobić to zaakceptować obrazów jako wejście. Czytałem wiele artykułów na ten temat. Niektórzy sugerowali akceptację kodowania base64 jako wejścia, a inni sugerowali akceptację rzeczywistego InputSteam.

Jednak nie widziałem jeszcze pełnego przykładu akceptacji metody InputStream. Czytałem o adnotacji @consumer i @Provider, ale wciąż nie mogę tego objąć. Czy istnieje jakiś artykuł, dokumentacja lub przykład, który w jakiś sposób prowadzi mnie w tym kierunku? tj. krok po kroku, jak zaimplementować zamiast wyświetlać teorię.

Wiem, że kodowanie base64 działa, ale z ciekawości chciałbym wiedzieć, jak inne podejście działa również ... Z góry dziękuję.

Odpowiedz

7

To powinno działać:

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

Nie próbowałem powyższego kodu, ale co zrobić, jeśli chcę mieć więcej niż jeden parametr? Seria ciągów znaków i typów pierwotnych ORAZ InputStream? A co jeśli chcę obsługiwać wszystkie typy obrazów? – Brams

+1

Jak ma wyglądać treść żądania HTTP POST? – yegor256

+0

yegor256, Nie jestem pewien, czy rozumiem twoje pytanie. Masz na myśli, w jaki sposób będę konstruował moje ciało? – Brams

4

Oto przykład przesyłanie:

@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"; 
} 

Jest (bezczelnie) skopiowane z tego example on github

Pamiętaj, że musisz zaakceptować POST expoprt Kodowanie MULTIPART_FORM_DATA, gdzie formularz obsługujący wpis wygląda następująco:

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

Dziękuję za odpowiedź. Jeśli używam tego narzędzia: http://code.google.com/p/gtm-oauth/ jako mój klient odpoczynku, to nie będę mógł użyć zwykłego formularza HTML do przesłania prośby o ponowne zalogowanie. Czy wiesz, w jaki sposób mogę użyć tego zestawu narzędzi do wysłania strumienia wejściowego? – Brams

+0

Nie jestem ekspertem od programowania jabłek, ale być może [ten post] (https://groups.google.com/forum/?fromgroups=#!topic/tumblr-api/ghFPbuaPxho) jest tym, czego szukasz –

Powiązane problemy