2016-07-29 118 views
0

我已经开发了一个REST服务,并在WildFly 9上部署了RESTEasy 3.0.12以上载本地文件系统中的文件。 我试图上传一个zip文件(使用POST MAN发送文件为二进制文件而不是多部分文件)我可以成功上传CSV,TXT文件格式,但是当我尝试发送ZIP文件时,它会在本地文件系统中正确保存但是当我试图把它解压说从REST服务以二进制InputStream形式上传.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

***在你的头错误一般资料:

,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(); 
    } 
    ... 
} 

我相信它会起作用。让我知道这是否会给你带来麻烦。祝你好运!

+1

这个工作就像一个沙利文!谢啦! – DarkAngeL