問題1:爲什麼我下載的圖片只有半張。或者我下的文件打開報文件損壞。
原因:你可能採用的是寫法是:https://www.jianshu.com/p/0951086020d9
byte[] buffer = new byte[inputStream.available() 這個是罪魁禍首。這個返回的僅僅是可讀取字節數。並不一定是我們文件的大小。所以我們應該採用的方式是:
byte[] buffer = new byte[inputStream.available()];
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
int n;
while ((n = inputStream.read(buffer)) != -1) {
toClient.write(buffer, 0, n);
}
問題2:爲什麼我下載的圖片的名字英文名是好的,中文名是下滑線
原因是:你沒有按照正確的格式返回,就是數據的字符格式沒有設置正確。
解決方案是:
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileBean.getName(),"UTF-8"));
問題2:爲什麼我下載的圖片的名字英文名是好的,中文名是一個加密後的名字
原因是:恭喜你,這不是你的原因,前端同學得對該數據進行轉義
這個我寫的幾種下載方式:
/**
* 下載文件
*
* @param fileBean
* @return
*/
@RequestMapping(path = "/download2", method = RequestMethod.POST, produces="application/json;charset=UTF-8")
public HttpServletResponse download2(@RequestBody FileBean fileBean,HttpServletResponse response) {
try {
//入參 桶名,文件名
ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME,fileBean.getFilePath());
//下載的文件流
InputStream inputStream = mssClientObjectService.getObject(objectRequest);
//具體的業務操作
//2、創建字節輸出流
byte[] b = new byte[1024];
//2、創建字節輸出流
OutputStream sos = response.getOutputStream();
int len ;
while((len=inputStream.read(b)) != -1){
sos.write(b,0 , len);
}
sos.close();
inputStream.close();
// 清空response
response.reset();
// 設置response的Header
response.addHeader("Content-Disposition",
"attachment;filename=" + new String(fileBean.getName().getBytes()));
response.addHeader("Content-Length",
"" + b.length);
response.setContentType("application/octet-stream");
} catch (AmazonClientException | IOException e) {
log.error("DPL:down File error :{}",fileBean,e);
}
return response;
}
/**
* 下載文件
*
* @param fileBean
* @return
*/
@RequestMapping(path = "/download3", method = RequestMethod.POST, produces="application/json;charset=UTF-8")
public HttpServletResponse download3(@RequestBody FileBean fileBean,HttpServletResponse response) {
try {
//入參 桶名,文件名
ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME,fileBean.getFilePath());
//下載的文件流
InputStream inputStream = mssClientObjectService.getObject(objectRequest);
//2、創建字節輸出流
byte[] b = new byte[inputStream.available()];
//2、創建字節輸出流
OutputStream sos = new BufferedOutputStream(response.getOutputStream());
int n;
while((n = inputStream.read(b)) != -1){
sos.write(b,0,n);
}
inputStream.close();
sos.flush();
sos.close();
// 設置response的Header
response.addHeader("Content-Disposition",
"attachment;filename=" + new String(fileBean.getName().getBytes()));
response.addHeader("Content-Length",
"" + b.length);
response.setContentType("application/octet-stream");
} catch (AmazonClientException | IOException e) {
log.error("DPL:down File error :{}",fileBean,e);
}
return response;
}
/**
* 下載文件
*
* @param fileBean
* @return
*/
@RequestMapping(path = "/download", method = RequestMethod.POST, produces="application/json;charset=UTF-8")
public HttpServletResponse download(@RequestBody FileBean fileBean,HttpServletResponse response) {
try {
//入參 桶名,文件名
ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME,fileBean.getFilePath());
//下載的文件流
InputStream inputStream = mssClientObjectService.getObject(objectRequest);
//具體的業務操作
byte[] buffer = toByteArray(inputStream);
inputStream.close();
// 清空response
response.reset();
// 設置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileBean.getName(),"UTF-8"));
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (AmazonClientException | IOException e) {
log.error("DPL:down File error :{}",fileBean,e);
}
return response;
}
private byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[input.available()];
int n;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
return output.toByteArray();
}
/**
* 下載文件
*
* @param fileBean
* @return
*/
@RequestMapping(path = "/download4", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public HttpServletResponse download4(@RequestBody FileBean fileBean, HttpServletResponse response) {
try {
// 清空response
response.reset();
//入參 桶名,文件名
ObjectRequest objectRequest = new ObjectRequest(BUCKET_NAME, fileBean.getFilePath());
//下載的文件流
InputStream inputStream = mssClientObjectService.getObject(objectRequest);
//具體的業務操作
byte[] buffer = new byte[inputStream.available()];
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
int n;
while ((n = inputStream.read(buffer)) != -1) {
toClient.write(buffer, 0, n);
}
// 設置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileBean.getName().getBytes()));
response.setContentType("application/octet-stream");
inputStream.close();
toClient.flush();
toClient.close();
} catch (AmazonClientException | IOException e) {
log.error("DPL:down File error :{}", fileBean, e);
}
return response;
}