2015-08-12 29 views
8

Mi trovo di fronte a un problema di creare una crude angolare con jax-rs sul backend. Il crud è molto semplice, alcuni campi di testo e un campo immagine.Come posso caricare immagini e dati nella stessa richiesta con angolare e riposizionato?

Ho il codice di lavoro per caricare un'immagine:

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

E nello strato 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> 

Quindi, la mia domanda è come posso fare questo in un solo passo in questo modo:

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

Se provo a chiamare il codice di cui sopra alla vista strato, il wildfly invia un errore che non ha trovato i dati a bin d con il parametro 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 

Qualcuno sa come posso farlo? O shoud lo faccio in due passi?

+0

Niente angularjs su questo .. – tariksbl

risposta

13

Tecnicamente, è possibile ottenere entrambi i dati da MultipartFormDataInput. Per esempio

<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(); 
} 

Se si vuole mettere tutto in un POJO, si può fare qualcosa di simile

public class MyEntity { 

    @FormParam("firstname") 
    private String firstname; 

    @FormParam("lastname") 
    private String lastname; 

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

    // Getter and Setters 
} 

Poi, nel tuo metodo di risorsa

@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(); 
} 

Visualizza maggiori:

+0

Ecco, il secondo funziona perfettamente per me. Grazie! – fdam