2015-08-12 2 views
8

У меня возникла проблема, чтобы сделать угловую crud с jax-rs на бэкэнде. Crud очень прост, некоторые текстовые поля и поле изображения.Как я могу загрузить изображение и данные по одному и тому же запросу с угловыми и релаксационными задачами?

У меня есть код работает, чтобы загрузить изображение:

@POST 
@Consumes("multipart/form-data") 
public Response uploadFile(MultipartFormDataInput input) { 
    ... 
} 

И в HTML слой:

<form action="http://localhost:8080/app/api/user" method="post" enctype="multipart/form-data"> 
    <p> 
    Choose a file : <input type="file" name="file" /> 
    </p> 
    <input type="submit" value="Upload" /> 
</form> 

Итак, мой вопрос, как я могу сделать это за один шаг, как это:

@POST 
@Consumes("multipart/form-data") 
public Response save(MultipartFormDataInput input, MyEntity entity) { 
    ... 
} 

Если я попытаюсь вызывать код, указанный выше, из слоя вида, wildfly дает ошибку, которая не находит данные в bin d с параметром MyEntity.

[org.jboss.resteasy.core.ExceptionHandler] (default task-3) failed to execute: javax.ws.rs.NotSupportedException: 
Could not find message body reader for type: class mypackage.MyEntity of content type: multipart/form-data;boundary=----WebKitFormBoundaryRXVvqLpZACPylNgS 

Кто-нибудь знает, как я могу это сделать? Или я делаю это в два шага?

+0

Ничто не angularjs об этом .. – tariksbl

ответ

13

Технически вы можете просто получить обе части данных из MultipartFormDataInput. Например

<form action="api/upload" method="post" enctype="multipart/form-data"> 
    Choose a file : <input type="file" name="file" /> 
    First name: <input type="text" name="firstname" /> 
    List name: <input type="text" name="lastname" /> 
    <input type="submit" value="Upload" /> 
</form> 

@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response upload(MultipartFormDataInput multipart) throws IOException { 

    try (InputStream in = multipart.getFormDataPart("file", InputStream.class, null); 
     FileOutputStream fos = new FileOutputStream("file.png")) { 
     byte[] buff = new byte[1024]; 
     int count; 
     while ((count = in.read(buff)) != -1) { 
      fos.write(buff, 0, count); 
     } 
    } 

    String firstname = multipart.getFormDataPart("firstname", String.class, null); 
    String lastname = multipart.getFormDataPart("lastname", String.class, null); 
    return Response.ok(firstname + ":" + lastname).build(); 
} 

Если вы хотите, чтобы положить все в POJO, вы можете сделать что-то вроде этого

public class MyEntity { 

    @FormParam("firstname") 
    private String firstname; 

    @FormParam("lastname") 
    private String lastname; 

    @FormParam("file") 
    private byte[] file; 

    // Getter and Setters 
} 

Тогда в вашем методе ресурсов

@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response upload(@MultipartForm MyEntity entity) throws IOException { 

    try (FileOutputStream fos = new FileOutputStream("file.png")) { 
     byte[] filebytes = entity.getFile(); 
     fos.write(filebytes); 
    } 

    String firstname = entity.getFirstname(); 
    String lastname = entity.getLastname(); 
    return Response.ok(firstname + ":" + lastname).build(); 
} 

Подробнее:

+0

Вот именно, вторая работа отлично для меня. Благодаря! – fdam

Смежные вопросы