我們都知道將文件上傳到阿里的OSS文件服務上后,可以通過generatePresignedUrl(bucketName, key, expiration)方法獲取該文件的防問路徑,但是當我們知道該文件的訪問路徑該如何通過路徑獲取該文件的下載流呢?
1、截取文件訪問路徑,只要該文件的名稱。
2、通過阿里API提供的getObject方法獲取文件信息
@GetMapping("/downLoadImage")
public void downLoadImage(String fileName, HttpServletResponse response) {
if (StringUtils.isNotBlank(fileName)) {
OSSObject ossObject = downLoadImage(fileName);
if (ossObject != null) {
InputStream inputStream = ossObject.getObjectContent();
int buffer = 1024 * 10;
byte data[] = new byte[buffer];
try {
response.setContentType("application/octet-stream");
// 文件名可以任意指定
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));//將文件名轉為ASCLL編碼
int read;
while ((read = inputStream.read(data)) != -1) {
response.getOutputStream().write(data, 0, read);
}
response.getOutputStream().flush();
response.getOutputStream().close();
ossObject.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public OSSObject downLoadImage(String fileName) {
OSSClient ossClient = getInstance();
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileName, HttpMethod.GET);
// 設置過期時間。
request.setExpiration(expiration);
// 生成簽名URL(HTTP GET請求)。
URL signedUrl = ossClient.generatePresignedUrl(request);
// 使用簽名URL發送請求。
Map<String, String> customHeaders = new HashMap<String, String>();
// 添加GetObject請求頭。
//customHeaders.put("Range", "bytes=100-1000");
OSSObject object = ossClient.getObject(signedUrl, customHeaders);
return object;
}
public static synchronized OSSClient getInstance() {
OSSClient ossClient = connInstances.get("oss");
if (ossClient == null) {
synchronized (FileUploadServiceImpl.class) {
if (ossClient == null) {
ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
}
}
}
return ossClient;
}
