阿里云OSS中,也支持分片上传

发布时间 2023-10-15 00:06:10作者: qd372502

对于大文件,尤其是大视频文件的上传,通常推荐使用分片上传(Multipart Upload)的方式。分片上传允许你将一个大文件分割成多个小的部分,然后分别上传。这种方式可以提高上传的效率和可靠性。在阿里云OSS中,也支持分片上传。以下是如何进行分片上传的步骤:

### 1. **通过SDK进行分片上传**:

以Java SDK为例,下面是进行分片上传的基本代码:

```java
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 java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MultipartUploadSample {

public static void main(String[] args) throws Exception {
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
String accessKeyId = "<YourAccessKeyId>";
String accessKeySecret = "<YourAccessKeySecret>";
String bucketName = "<YourBucketName>";
String objectName = "<YourObjectName>"; // 文件名,例如video.mp4
String localFile = "<YourLocalFilePath>"; // 本地文件路径和名字

OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 开始Multipart Upload。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
String uploadId = result.getUploadId();

// 上传分片。
final int partSize = 1 * 1024 * 1024; // 1MB
final File sampleFile = new File(localFile);
final long fileLength = sampleFile.length();
final int partCount = (int) (fileLength / partSize + (fileLength % partSize == 0 ? 0 : 1));

List<PartETag> partETags = new ArrayList<PartETag>();
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
InputStream instream = new FileInputStream(sampleFile);
// 跳过已经上传的分片。
instream.skip(startPos);
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setObjectKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(instream);
uploadPartRequest.setPartSize(curPartSize);
uploadPartRequest.setPartNumber(i + 1);
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
partETags.add(uploadPartResult.getPartETag());
instream.close();
}

// 提交分片上传任务。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
ossClient.completeMultipartUpload(completeMultipartUploadRequest);

// 关闭OSSClient。
ossClient.shutdown();
}
}
```

在上述代码中,替换`<YourAccessKeyId>`、`<YourAccessKeySecret>`、`<YourBucketName>`、`<YourObjectName>`和`<YourLocalFilePath>`为你的实际值。

### 2. **使用阿里云OSS的上传工具**:

阿里云OSS提供了一些上传工具,比如OSS Browser,可以方便地进行大文件的分片上传。你只需下载并安装OSS Browser,然后按照界面提示进行操作即可。

### 3. **使用命令行工具**:

阿里云也提供了命令行工具,你可以通过命令行工具进行分片上传。

以上是通过SDK和阿里云提供的工具进行大视频文件上传的基本方法。通过分片上传,你可以在网络条件不佳时保持上传的稳定,甚至在上传过程中暂停和恢复上传。