前些天寫了文件下載的代碼,測試的時候使用的文件比較小(小於4K)沒有問題。
今天在做一個相似的功能時上傳了一個大於4k的文件發現下載的文件永遠只有4K。首先檢查數據庫中存儲的文件內容對不對,發現沒有問題。最後定位應該是下載的時候讀取的問題。
錯誤的寫法是我使用了Oralce的BOLB字段去讀取字段內容,這樣它每次讀取最大爲4K。
最後改寫成byte[]數組的方式去獲取就沒有問題了,具體修改前後代碼如下:
修改前:
Map<String, Object> diaryNotes = diaryManageService.getADiaryNotes(serialNumber, dbType);
response.setContentType("application/octet-stream");
String fileName = (String)diaryNotes.get("attachmentFileName");
ServletOutputStream outSTr = null;
try {
String codeFileName = URLEncoder.encode(fileName,"UTF-8");
response.setHeader("Content-Disposition", "attachment; filename* = UTF-8''" + codeFileName);
byte[] context = ((BLOB)diaryNotes.get("attachmentContent")).getPrefetchedData();
outSTr = response.getOutputStream(); // 建立
outSTr.write(context);
outSTr.flush();
} catch (Exception e) {
logger.error("下載日誌附件失敗", e);
} finally {
try {
outSTr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
修改後:
DiaryNotesObject diaryNotes = diaryManageService.getADiaryNotes(serialNumber, dbType);
response.setContentType("application/octet-stream");
ServletOutputStream outSTr = null;
try {
String codeFileName = URLEncoder.encode(diaryNotes.getAttachmentFileName(),"UTF-8");
response.setHeader("Content-Disposition", "attachment; filename* = UTF-8''" + codeFileName);
outSTr = response.getOutputStream(); // 建立
outSTr.write(diaryNotes.getAttachmentContent());
outSTr.flush();
} catch (Exception e) {
logger.error("下載日誌附件失敗", e);
} finally {
try {
outSTr.close();
} catch (Exception e) {
e.printStackTrace();
}
}