如何使用 jax-rs 进行分段/表单文件上传?

问题描述 投票:0回答:2

(特别是 RESTeasy)

(对于单个文件)拥有如下方法签名会很好:

public void upload(@FormParam("name") ..., @FormParam("file") file: InputStream)
... 

可行吗?还是我在做梦?似乎没那么简单。

jax-rs resteasy
2个回答
30
投票

关键是利用 RESTEasy 附带的 @MultipartForm 注释。这使您能够定义包含表单所有部分的 POJO 并轻松绑定它。

以下面的 POJO 为例:

public class FileUploadForm {
    private byte[] filedata;

    public FileUploadForm() {}

    public byte[] getFileData() {
        return filedata;
    }

    @FormParam("filedata")
    @PartType("application/octet-stream")
    public void setFileData(final byte[] filedata) {
        this.filedata = filedata;
    }
}

现在您需要做的就是在实体中使用这个 POJO,它看起来像这样:

@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response create(@MultipartForm FileUploadForm form) 
{
    // Do something with your filedata here
}

0
投票

JAX-RS 3.1(正式称为“Jakarta RESTful Web 服务”;Jakarta EE 10 的一部分)开始,您可以执行以下操作:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response postWidget(
        @FormParam("name") String name,
        @FormParam("file") EntityPart file) {
    var fileName = file.getName().orElseThrow();
    var inputStream = file.getContent();
}

这不仅是一个标准,而且更易于使用。

请注意,我刚刚发现

@FormParam
在 RestEasy 6.2.7 中不起作用。您必须阅读所有部分并找到您自己的部分:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response postWidget(
        List<EntityPart> parts) {
    var file = parts.stream().filter(part -> "file".equals(part.getName())).findFirst().orElseThrow();
    var inputStream = file.getContent();
}
© www.soinside.com 2019 - 2024. All rights reserved.