2016-07-29 105 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