代码之家  ›  专栏  ›  技术社区  ›  fdam

我如何在同一请求中上传图像和数据,并具有一定的角度和还原性?

  •  12
  • fdam  · 技术社区  · 9 年前

    我面临着一个问题,即如何在后端使用jax-rs创建一个有角度的crud。 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会给出一个错误,即找不到要与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
    

    有人知道我该怎么做吗?还是我应该分两步做?

    1 回复  |  直到 9 年前
        1
  •  21
  •   Paul Samsotha    9 年前

    从技术上讲,您可以从 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();
    }
    

    查看更多: