OSS下载
紧接上一篇的上传来说一下断点下载,需要上传的小伙伴可以看上一篇的断点上传0000
- 上传的时候我们需要拿到key和sercert,下载的i时候同样需要,不过下载的时候我们是只读,只需要拿到只读的key就可以实现我们想要的,这样也增加了安全性
public static final OSS getOSSClient() {
OSS ossClient = new OSSClientBuilder().build(ALIYUN_OSS_ENDPOINT, ALIYUN_ACCESS_KEY_ID, ALIYUN_OSS_ACCESS_KEY_SECRET);
return ossClient;
}
下载代码
//下载文件 fileName=202020243054.jpg filepath = 20200527/202020243054.jpg
//下载文件
public static String download(String fileName, String filePath) throws FileNotFoundException {
String result = null;
ObjectMetadata objectMetadata = null;
//只读的key
String endpoint = OSS_ENDPOINT;
String accessKeyId = OSS_ACCESSKEYID;
String accessKeySecret = OSS_ACCESSKEYSECRET;
String bucketName = OSS_BUCKET;
//资源所在的文件夹名称
//String objectName = "29020203";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String[] split = filePath.split("/");
String s = split[0];
String dirpath = PIC_PATH + File.separator + s;
//下载的文件名称
File file = new File(dirpath);
if (!file.exists()) {
file.mkdirs();
}
//文件断点下载存储的文件地址
String checkPoint = PIC_PATH + File.separator + "checkpoint";
File checkpoint = new File(checkPoint);
if (!checkpoint.exists()) {
checkpoint.mkdirs();
}
boolean b = ossClient.doesObjectExist(bucketName, filePath);
//判断文件是否存在
if (b) {
// 下载请求,10个任务并发下载,启动断点续传。 objectName : 文件的路径
DownloadFileRequest downloadFileRequest = new DownloadFileRequest(bucketName, filePath);
//存放的本地的文件路径
//dirpath + File.separator +
downloadFileRequest.setDownloadFile(dirpath + File.separator + fileName);
downloadFileRequest.setPartSize(1 * 1024 * 1024);
downloadFileRequest.setTaskNum(10);
downloadFileRequest.setEnableCheckpoint(true);
// downloadFileRequest.setCheckpointFile("checkpoint" + fileName);
downloadFileRequest.setCheckpointFile(checkPoint + File.separator + fileName.substring(0, fileName.lastIndexOf(".")) + ".ucp");
//downloadFileRequest.setCheckpointFile(checkPoint+File.separator);
try {
// 下载文件。
DownloadFileResult downloadRes = ossClient.downloadFile(downloadFileRequest);
// 下载成功时,会返回文件元信息。
objectMetadata = downloadRes.getObjectMetadata();
result = downloadRes.getObjectMetadata().getETag();
//下载的文件可能存在损坏的情况,这个时候判断文件下载下来的crc和阿里云上的是否一致
//crc64加密 云服务
Long serverCRC = downloadRes.getObjectMetadata().getServerCRC();
//获取下载的本地流文件
File files = new File(dirpath + File.separator + fileName);
if(files.exists()) {
//文件获取crc64
InputStream fileInputStream = new FileInputStream(files);
//读取流并且获取crc64
byte[] bytes = IOUtils.readStreamAsByteArray(fileInputStream);
CRC64 crc64 = new CRC64(bytes, bytes.length);
Long value1 = crc64.getValue();
//读取流关闭,不然删除不掉文件
fileInputStream.close();
if (serverCRC.longValue() != value1.longValue()) {
//删除破损的文件
files.delete();
}
}
} catch (NullPointerException e) {
//OSS下载时checkpoint出错,抛出空指针错误,删除checkpoint
file = new File(checkPoint + File.separator + fileName.substring(0, fileName.lastIndexOf(".")) + ".ucp");
if (file.exists()) {
file.delete();
}
e.printStackTrace();
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
// 关闭OSSClient。
ossClient.shutdown();
}
return result;
} else {
throw new FileNotFoundException("文件不存在");
//return "文件不存在";
}
}
本文介绍如何使用Java进行阿里云OSS的断点下载,重点在于利用只读Key确保安全并提供下载代码。

991

被折叠的 条评论
为什么被折叠?



