2015-08-12 4 views
8

Ich habe ein Problem, mit jax-rs auf Backend eine eckige Crud zu machen. Die Crud ist sehr einfach, einige Textfelder und ein Bildfeld.Wie kann ich Bilder und Daten in der gleichen Anfrage mit eckigen und Resteasy hochladen?

Ich habe den Code, um ein Bild hochzuladen arbeiten:

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

Und in der HTML-Ebene:

<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> 

Also, meine Frage ist, wie kann ich dies wie dies in einem Schritt zu tun:

Wenn ich versuche, den Code oben aus Sichtlayer aufzurufen, geben die Wildfly einen Fehler, der Daten nicht gefunden zu bin d mit MyEntity-Parameter.

[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 

Weiß jemand, wie kann ich das tun? Oder soll ich es in zwei Schritten machen?

+0

Nichts AngularJS darüber .. – tariksbl

Antwort

13

Technisch können Sie nur beide Daten von der MultipartFormDataInput bekommen. Zum Beispiel

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

Wenn Sie alles in ein POJO setzen möchten, können Sie so etwas wie dieses

public class MyEntity { 

    @FormParam("firstname") 
    private String firstname; 

    @FormParam("lastname") 
    private String lastname; 

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

    // Getter and Setters 
} 

Dann in Ihrem Ressource-Methode tun

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

Mehr:

+0

Das ist es, die zweite Arbeit perfekt für mich. Vielen Dank! – fdam

Verwandte Themen