我用oss java put方法上传,超过5g不让传。还要把文件分次上传,要用的时候一个一个下载下来,合起来才能用。好麻烦。
是有更好的方法?还是阿里云oss自己的问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云OSS(Object Storage Service)支持大文件上传,对于大于5GB的文件,建议使用分片上传(Multipart Upload)功能。这个不是OSS的问题,而是网络传输和系统处理能力的普遍限制。几乎所有云存储服务都会对单次上传大小有所限制,并提供类似分片上传的方式来处理大文件。
分片上传的优点是可以将大文件拆分为多个小块(分片),分别上传这些分片,最后再将所有分片合并成一个完整的文件。这样做的好处包括:
在Java中使用阿里云OSS SDK进行分片上传,你可以参考以下步骤:
确保你已经安装了阿里云OSS Java SDK,并配置好了访问密钥和Bucket信息。
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
import com.aliyun.oss.model.InitiateMultipartUploadResult;
import com.aliyun.oss.model.UploadPartRequest;
import com.aliyun.oss.model.UploadPartResult;
import com.aliyun.oss.model.CompleteMultipartUploadRequest;
import com.aliyun.oss.model.PartETag;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MultipartUploadExample {
public static void main(String[] args) throws IOException {
String endpoint = "<yourEndpoint>";
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
String objectName = "<yourObjectName>";
File file = new File("<yourLocalFilePath>");
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 初始化分片上传请求。
InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult initResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
String uploadId = initResult.getUploadId();
// 计算分片数。
int partSize = 5 * 1024 * 1024; // 每个分片大小,这里设为5MB
long fileSize = file.length();
int partCount = (int) (fileSize / partSize);
if (fileSize % partSize != 0) {
partCount++;
}
List<PartETag> partETags = new ArrayList<>();
FileInputStream fis = new FileInputStream(file);
for (int i = 0; i < partCount; i++) {
UploadPartRequest uploadPartRequest = new UploadPartRequest()
.withBucketName(bucketName)
.withKey(objectName)
.withUploadId(uploadId)
.withInputStream(fis)
.withPartSize(partSize)
.withPartNumber(i + 1);
if (i == partCount - 1) {
uploadPartRequest.withPartSize((int)(fileSize - partSize * i));
}
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
partETags.add(uploadPartResult.getPartETag());
}
fis.close();
// 完成分片上传。
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println("分片上传成功");
} catch (Exception e) {
System.out.println("分片上传失败:" + e.getMessage());
// 如果需要,可以在这里调用abortMultipartUpload方法取消分片上传
} finally {
// 关闭OSSClient。
ossClient.shutdown();
}
}
}
请替换<yourEndpoint>
、<yourAccessKeyId>
、<yourAccessKeySecret>
、<yourBucketName>
、<yourObjectName>
以及<yourLocalFilePath>
为你自己的实际值。
通过上述代码,你可以实现大文件的分片上传,虽然过程稍微复杂一些,但能有效解决大文件上传问题,并且在下载时,用户并不需要关心文件是否被分片,可以直接下载完整文件使用。