2013-02-13 14 views
7

Hiện tại, tôi đã phát triển các dịch vụ web JAX-RS cho các nhu cầu phát triển của mình. Tất cả các phương thức mà tôi đã viết cho đến nay đều chấp nhận các chuỗi java hoặc các kiểu nguyên thủy làm đầu vào.JAX-RS Chấp nhận hình ảnh làm đầu vào

Một ví dụ về một phương pháp như:

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

Những gì tôi đang cố gắng để làm bây giờ là chấp nhận hình ảnh như đầu vào. Tôi đã đọc rất nhiều bài viết về vấn đề này. Một số gợi ý chấp nhận mã hóa base64 làm đầu vào và một số khác đề nghị chấp nhận một InputSteam thực tế.

Tuy nhiên, tôi chưa thấy ví dụ đầy đủ về cách chấp nhận InputStream. Tôi đã đọc về chú thích @consumer và @Provider nhưng tôi vẫn không thể bao quanh đầu mình. Có bài viết, tài liệu hay ví dụ nào đó hướng dẫn tôi về vấn đề này không? tức là Quy trình từng bước về cách triển khai thay vì hiển thị lý thuyết.

Tôi biết rằng các mã hóa base64 hoạt động nhưng ra khỏi tò mò tôi muốn biết cách tiếp cận khác hoạt động như thế nào ... Cảm ơn trước.

Trả lời

7

này nên làm việc:

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

Tôi không thử mã ở trên, nhưng nếu tôi muốn có nhiều tham số thì sao? Một chuỗi các chuỗi và các kiểu nguyên thủy VÀ một InputStream? Ngoài ra nếu tôi muốn hỗ trợ tất cả các loại hình ảnh thì sao? – Brams

+1

Bạn muốn cơ thể yêu cầu HTTP POST của mình trông như thế nào? – yegor256

+0

yegor256, tôi không chắc tôi hiểu câu hỏi của bạn. Bạn có nghĩa là làm thế nào tôi sẽ được xây dựng cơ thể yêu cầu của tôi? – Brams

4

Dưới đây là ví dụ upload:

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

Nó được (không biết xấu hổ) sao chép từ này example on github

Lưu ý rằng bạn cần phải chấp nhận một whith POST Mã hóa MULTIPART_FORM_DATA, trong đó biểu mẫu xử lý bài đăng là:

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

Cảm ơn câu trả lời của bạn. Nếu tôi đang sử dụng công cụ này: http://code.google.com/p/gtm-oauth/ làm ứng dụng khách của tôi, thì tôi sẽ không thể sử dụng biểu mẫu HTML thông thường để gửi yêu cầu còn lại của mình. Bạn có biết làm thế nào tôi có thể sử dụng bộ công cụ này để gửi một luồng đầu vào? – Brams

+0

Tôi không có chuyên gia về lập trình táo, nhưng có thể [bài đăng này] (https://groups.google.com/forum/?fromgroups=#!topic/tumblr-api/ghFPbuaPxho) là những gì bạn đang tìm kiếm –