下面是保存在檔案中的上傳請求。在運行時,我需要讀取檔案并將占位符 {{stream}} 替換為輸入流資料(我需要上傳的檔案的流資料)
--Content Boundary
Content-Disposition: form-data; name="metadata"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"id":"docupload","body":{"file":[{}]}}
--Content Boundary
Content-Disposition: form-data; name="inputFile"; filename="file1.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Transfer-Encoding: binary
{{stream}}
--Content Boundary--
我使用下面的方法將資料的上傳檔案流轉換為字串,然后我將替換占位符,
ByteArrayOutputStream bos = new ByteArrayOutputStream();
workbook.write(bos); // workbook is instance of XSSFWorkbook which I used to create at runtime
return new String(bos.toByteArray(), StandardCharsets.UTF_8);
但是當我嘗試下載時,我的檔案已損壞。幫助我完成我做錯的程序。提前致謝
uj5u.com熱心網友回復:
我嘗試重新創建代碼,使用 toString() 方法讓它作業沒有問題:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
workbook.write(bos);
System.out.println(bos.toString(StandardCharsets.UTF_8););
} catch (IOException e) {
e.printStackTrace();
}
您是否嘗試過使用 toStringMethod()?希望對你有幫助,如果沒有請回復!如果可以的話,我很樂意嘗試并提供幫助:)
uj5u.com熱心網友回復:
我已閱讀您的評論,我想我更了解正在發生的事情。再次,如果我錯了,請糾正我。根據我收集的資訊,您正在嘗試上傳檔案,在服務器上使用 XSSFWorkbook 處理它,將輸出保存為 excel .xlsx 電子表格,然后將其回傳給客戶端。
這里的問題是,如果輸入檔案非常大,XSSFWorkbook 可能需要很長時間來處理它。所以我會以不同的方式處理這個程序。
首先,我會上傳我想用 POST multipart 處理的檔案,或者它可能很方便。(順便說一句,現在, {"id":"docupload","body":{"file":[{}]}} 表示檔案為空,但我假設您錯過了資料以保持問題簡短) . 然后后端將回應 200 OK(或一個有用的回應,讓客戶端知道上傳失敗的原因)。然后服務器可以在單獨的執行緒中使用 XSSFWorkbook 開始處理檔案。
其次,客戶端可以偶爾輪詢服務器處理是否完成。(或者,可以在此處使用 WebSockets)。服務器完成處理后,它可以回傳帶有“Content-Disposition:attachment”標頭的回應。
我認為這里的問題是這樣的“重”任務是異步的,因為呼叫者不知道它什么時候完成(我們可能會遇到請求超時)。
在這種情況下,我認為最好將上傳和處理任務拆分為單獨的 HTTP 操作,以保持服務 RESTful。
我希望我們用這個破案!請告訴我進展如何。如果我沒有完全得到您的要求,我很樂意嘗試并提供幫助:D
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367401.html
