java - 如何创建 Jersey FormDataContentDisposition 对象?

标签 java jersey multipartform-data

我在服务中有以下方法:

public interface MyService {    
    @POST
    @Path("/upload-file")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    void uploadFile(@FormDataParam("file") InputStream inputStream,
                    @FormDataParam("file") FormDataContentDisposition contentDisposition);
}

然后我使用 WebResourceFactory 创建了这个接口(interface)的一个实例:

final MyService buildProxy() {
    final ClientBuilder clientBuidler = ClientBuilder.newBuilder();
    // register components, trust manager, etc.
    final WebTarget target = clientBuilder.build().target("http://myservice.example.com");
    return WebResourceFactory.newResource(
            MyService.class, target, false, ImmutableMultivaluedMap.empty(), 
            Collections.emptyList(), new Form());
}

我想使用此代理调用我的方法,但我找不到创建 FormDataContentDisposition 的方便方法。我最好的选择真的是创建 header 字符串,然后将其传递到 new FormDataContentDisposition(String header) 中吗?我可以在某处放松我的类型以访问更方便的构造函数吗?我可以在文件上传中使用不同的、更方便的界面吗?我主要在我的界面中包含内容配置,这样我可以在将整个文件保存到磁盘之前拒绝一个太大的文件。

最佳答案

您可以只在客户端和服务器参数中使用 FormDataMultipartFormDataMultiPart 使您能够以编程方式而不是声明方式访问所有 body 部位。这将为您在客户端提供更多的自由。请参阅下面的完整测试用例

public class ProxyMultiPartTest extends JerseyTest {

    public static interface IUploadResource {
        @POST
        @Consumes(MediaType.MULTIPART_FORM_DATA)
        String upload(FormDataMultiPart multipart) throws Exception;
    }

    @Path("upload")
    public static class UploadResource implements IUploadResource {
        @Override
        public String upload(FormDataMultiPart multiPart) throws Exception {
            FormDataBodyPart bodyPart = multiPart.getField("file");
            FormDataContentDisposition fdcd = bodyPart.getFormDataContentDisposition();
            System.out.println("filename: " + fdcd.getFileName());
            System.out.println("size: " + fdcd.getSize());
            InputStream body = bodyPart.getValueAs(InputStream.class);
            StringWriter writer = new StringWriter();
            ReaderWriter.writeTo(new InputStreamReader(body), writer);
            return writer.toString();
        }
    }

    @Override
    public ResourceConfig configure() {
        return new ResourceConfig()
                .register(UploadResource.class)
                .register(MultiPartFeature.class)
                .register(new LoggingFilter(Logger.getAnonymousLogger(), true));

    }

    @Test
    public void testProxyClientUpload() throws Exception {
        try (Writer writer = new BufferedWriter(new FileWriter("demo.txt"))) {
            writer.write("Hello World");
        }
        WebTarget target = target("upload").register(MultiPartFeature.class);
        IUploadResource resource = WebResourceFactory.newResource(IUploadResource.class, target);
        FileDataBodyPart filePart = new FileDataBodyPart("file", new File("demo.txt"));
        FormDataMultiPart multiPart = new FormDataMultiPart();
        multiPart.bodyPart(filePart);

        String response = resource.upload(multiPart);
        assertEquals("Hello World", response);
    }
}

关于java - 如何创建 Jersey FormDataContentDisposition 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43945734/

相关文章:

rest - 使用 HTTPS 的持久连接不起作用

java - 使用 Jersey 对 Google Translate 进行 POST 调用会返回 HTTP 404

javascript - React-Native,axios Post FormData,每个部分具有不同的 Content-Type

Python:urllib2 multipart/form-data 和代理

java - Apache POI 无法从 Excel 单元格中正确读取秒数

java - 使用 Jersey 发送 JSON 字符串数组

java - 将 java 应用程序转换为 mac 安装程序...dmg

javascript - 将 HTML/Express.js 设置从 POST 更改为 PUT?

Java DOM XML 解析器 - 打印的 XML 包含一个标签而不是多个标签

java - 如何使用通用参数正确查询构造函数