从 REST 服务上传一个 .zip 文件作为二进制 InputStream

Uploading a .zip file as binary InputStream from REST service

我在 WildFly 9 上部署了 RESTEasy 3.0.12 开发了一个 REST 服务来上传本地文件系统中的文件。 我试图上传一个 zip 文件(使用 POST MAN 以二进制方式发送文件而不是 multi-part 进行测试)我可以成功上传 CSV、TXT 文件格式,但是当我尝试发送 ZIP 文件时它保存正确在本地文件系统中,但是当我尝试解压缩时它说

代码:

@Path("/uploadZip")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response uploadZip(@Context HttpServletRequest req, InputStream payload){

    // save to filesystem local.

    Writer wr = null;
    String tempFileName = System.getProperty("java.io.tmpdir");
        try {
            wr = new BufferedWriter(new FileWriter(tempFileName));
            IOUtils.copy(payload, wr, "UTF-8");
        } catch (IOException e) {
            return errorResponse;
        } finally {
            // closing writer and stream
            IOUtils.closeQuietly(wr);
            IOUtils.closeQuietly(payload);
        }

        ...
}

有谁知道如何保存好的 zip 文件?

***关于您的 Headers 错误的一般信息:

Zip 文件包含本地 headers 和文件末尾的中央目录。我不知道这些令人毛骨悚然的细节——我也不会尝试详细说明它们,但是如果您收到 headers 错误,那么您的 zip 文件已损坏。我不确定 "payload data."

之后有一些数据是什么意思

***对代码的思考:让我们从概念上思考。

您的端点正在捕获一个 InputStream object,它是所有表示字节输入流的 InputStream object 的超类。您的文件基本上包装在一个 object 中,您可以从 byte-for-byte 中读取它。我看到的第一个问题是您声明了一个 Writer 来写入来自 InputStream 的那些字节。请记住——读者和作家用于写入 字符流 ,输入和输出流用于 字节流 。这就解释了为什么你的 CSV 和 TXT 文件是成功的。了解并记住这种差异很重要!

@Path("/uploadZip")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response uploadZip(@Context HttpServletRequest req, InputStream payload){

OutputStream fos = new FileOutputStream(new File("path/to/filename.zip");

    try {
        byte[] bufferSize = new byte[1024];
        int i = 0;
        while ((i = payload.read(bufferSize)) != -1) {
            fos.write(buf, 0, i);
        }
    } catch (IOException e) {
        return errorResponse;
    } finally {
        fos.close();
    }
    ...
}

我相信它会奏效。如果这给您带来任何麻烦,请告诉我。祝你好运!