Jboss RestEasy - Как извлечь двоичные данные из нескольких частей MIME MultipartInput, используя multipart / mixed - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть MultipartInput, который состоит из двух частей

  • Part1 - XML-строка
  • Part2 - Двоичные данные (изображение)

Вот пример того, как я извлекаю данные из частей

@POST
@Path("/mixedMime")
@Consumes("multipart/mixed")
@ResponseStatus(HttpStatus.OK)
public String mixedMime(@Context ServletContext servletContext, MultipartInput input) throws Exception{


   int index = 0;
   String xmlText; 
   byte[] imageData;

   for (InputPart part : input.getParts()) {
      index++;

      if(index==1){
        //extract the xml test
        xmlText = part.getBodyAsString()
      }

      if(index==2){
        //extract the image data
        imageData = part.getBody(???<<<<< WHAT GOES HERE >>>>???);
      }

   }
}

Как мне извлечь данные изображения (двоичные данные), показанные выше? Я использую Jboss 7.0.2. Согласно документации на http://docs.jboss.org/resteasy/docs/2.3.0.GA/userguide/html/Multipart.html говорится, что мне нужно указать класс? какой класс?

Спасибо

Редактировать

Извините, я забыл указать, как я отправляю данные в службу REST. Вот соответствующий код от клиента. В основном я добавляю XML-файл из файловой системы в качестве первой части. Изображение как вторая часть.

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://localhost:8080/RestTest/rest/mixedmime");

    Scanner scanner = 
       new Scanner(new File("myXmlFile.xml")).useDelimiter("\\Z");
       String messageHeader = scanner.next();
       scanner.close();


    FileBody bin = new FileBody(new File("dexter.jpg"));
    StringBody header = new StringBody(messageHeader.toString());

    MultipartEntity reqEntity = new MultipartEntity();
    reqEntity.addPart("header", header);
    reqEntity.addPart("payload", bin);
    httppost.setEntity(reqEntity);

    HttpResponse response = httpclient.execute(httppost);   

1 Ответ

3 голосов
/ 15 февраля 2012

Вот простой пример того, как вы будете обрабатывать двоичные (потоковые) данные из многокомпонентного запроса с помощью RESTEasy:

Во-первых, определите класс для сопоставления вашей многокомпонентной формы:

public class DataUploadForm implements Serializable {
   static final long serialVersionUID = IL;

   @FormParam("xml")
   private String xml;

   @FormParam("file")
   private InputStream fileStream;

   public FileUploadForm() {
       super();
   }

   // Getters and setters here
}

Затем в интерфейсе веб-службы объявите метод, который обрабатывает многокомпонентный контент и сопоставит его с вашим пользовательским классом:

@POST
@Path("/somepath")
@Consumes({ MediaType.MULTIPART_FORM_DATA })
public Response uploadData(@MultipartForm DataUploadForm uploadForm);

А в реализации вашего веб-сервиса обработайте входящий запрос:

@Override
public Response uploadData(DataUploadForm uploadForm) {

    System.out.printf("Incoming xml data: %s\n", uploadForm.getXML());
    System.out.printf("Incoming binary data: %s\n", uploadForm.getFileStream());

    // Processing the input stream. For example, by using Apache Commons IO
    final byte[] data ;
    try {
       data = IOUtils.toByteArray(uploadForm.getFileStream());
    } catch (IOException ioe) {
       throw new WebApplicationException("Could not read uploaded binary data");
    }

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