从REST服务上载.zip文件作为二进制InputStream

时间:2016-07-29 23:34:56

标签: java rest zip wildfly resteasy

我已经在WildFly 9上部署了RESTEasy 3.0.12的REST服务,以便在本地文件系统中上传文件。 我试图上传一个zip文件(使用POST MAN发送文件作为二进制而不是多部分进行测试)我可以成功上传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文件?

1 个答案:

答案 0 :(得分:1)

***关于标题错误的一般信息:

Zip文件包含本地标头和文件末尾的中央目录。我不知道可怕的细节 - 我不会尝试扩展它们,但如果您收到标题错误,那么您的zip文件已损坏。在"有效载荷数据之后,我不确定你的意思是什么。"

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

您的端点正在捕获一个InputStream对象,该对象是表示输入字节流的所有InputStream对象的超类。您的文件基本上包装在一个可以逐字节读取的对象中。我看到的第一个问题是你声明一个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();
    }
    ...
}

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