Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Jersey 2中流式传输多部分_Java_Json_Jersey_Streaming_Multipart - Fatal编程技术网

Java 在Jersey 2中流式传输多部分

Java 在Jersey 2中流式传输多部分,java,json,jersey,streaming,multipart,Java,Json,Jersey,Streaming,Multipart,我目前有Jersey REST代码来流式处理单个文件,效果非常好: StreamingOutput stream = new StreamingOutput() { @Override public void write(OutputStream out) throws IOException { final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);

我目前有Jersey REST代码来流式处理单个文件,效果非常好:

StreamingOutput stream = new StreamingOutput() {
    @Override
    public void write(OutputStream out)
    throws IOException {
        final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);

        // Stream is filled with data in this method.
        restDAO.readData(bufferedOutputStream);
        bufferedOutputStream.flush();
        bufferedOutputStream.close();
    }
};

return Response.ok(body, mimeType).header("filename", getFileName()).build();
但是,我想流式传输一个包含大文件和JSON的多部分文件,这样做:

FormDataMultiPart multiPart = new FormDataMultiPart();
multiPart.bodyPart(jsonObject, MediaType.APPLICATION_JSON_TYPE);
String mimeType = "application/octet-stream";

StreamingOutput stream = new StreamingOutput() {
    @Override
    public void write(OutputStream out)
    throws IOException {
        final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);

        // Stream is filled with data in this method.
        restDAO.readData(bufferedOutputStream);
        bufferedOutputStream.flush();
        bufferedOutputStream.close();
    }
};
multiPart.bodyPart(stream, MediaTypeUtil.stringToMediaType(mimeType));

return Response.ok(multiPart, MediaType.MULTIPART_FORM_DATA).build();
但是,上述代码不起作用。我在运行javax.ws.rs.BadRequestException:HTTP400错误请求时遇到此错误


是否可以以类似的方式流式传输多部分?我看到的主要问题是,进入多部分的文件来自流本身。

为了正确地流式处理多部分,我使用了PipedInputStream和PipedOutStream以及一个线程:

PipedOutputStream pipedOutputStream = new PipedOutputStream();
PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);
final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(pipedOutputStream);

FormDataMultiPart multiPart = new FormDataMultiPart();
multiPart.bodyPart(jsonObject, MediaType.APPLICATION_JSON_TYPE);
String mimeType = "application/octet-stream";

// Multipart streaming.
// Write to the PipedOutputStream in a separate thread
Runnable runnable = new Runnable() {
    public void run() {
        try {
            restDAO.readData(bufferedOutputStream);
            bufferedOutputStream.flush();
            bufferedOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

Thread fileThread = new Thread(runnable, "MultiPartFileStreamer");
fileThread.start();
final StreamDataBodyPart streamDataBodyPart = new StreamDataBodyPart(
    "file", pipedInputStream, data.getContentFileName(), 
    MediaUtils.stringToMediaType(mimeType));
multiPart.bodyPart(streamDataBodyPart);

return Response.ok(multiPart, MediaType.MULTIPART_FORM_DATA).build();