开发者社区 问答 正文

ios-oss-sdk临时取消上传

请问ios-oss-sdk临时取消上传该怎么做?

展开
收起
l_z_l 2016-03-14 09:50:58 5589 分享 版权
阿里云 AI 助理回答

在使用阿里云对象存储(OSS)的iOS SDK时,如果需要临时取消上传任务,可以通过以下方法实现。具体操作分为两种场景:中断上传取消分片上传


1. 中断上传

中断上传是指在调用上传接口过程中停止当前任务。适用于所有类型的上传接口,包括普通上传和分片上传。

实现步骤

  • 调用DisableRequest方法来中断当前正在进行的上传任务。
  • 该方法会立即停止所有未完成的上传请求,并返回错误码以确认中断成功。

示例代码

以下是中断上传的示例代码:

#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;

int main(void)
{
    // 初始化OSS账号信息
    std::string Endpoint = "yourEndpoint";
    std::string Region = "yourRegion";
    std::string BucketName = "examplebucket";
    std::string ObjectName = "exampledir/exampleobject.txt";

    // 初始化网络等资源
    InitializeSdk();
    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    std::vector<PutObjectOutcomeCallable> Callables;
    for (int i = 0; i < 4; i++) {
        std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>("yourLocalFilename", std::ios::in | std::ios::binary);
        PutObjectRequest request(BucketName, ObjectName, content);
        auto outcomeCallable = client.PutObjectCallable(request);
        Callables.emplace_back(std::move(outcomeCallable));
    }

    std::this_thread::sleep_for(std::chrono::milliseconds(1000));

    // 中断上传
    client.DisableRequest();
    for (size_t i = 0; i < Callables.size(); i++) {
        auto outcome = Callables[i].get();
        if (outcome.error().Code() == "ClientError:100002" ||
            outcome.error().Code() == "ClientError:200042") {
            std::cout << "disable putobject success" << std::endl;
        }
    }

    // 释放网络等资源
    ShutdownSdk();
    return 0;
}

注意事项

  • 中断上传仅停止当前任务,不会通知OSS清理已上传的分片。
  • 如果需要彻底取消分片上传任务,请参考下文的“取消分片上传”。

2. 取消分片上传

取消分片上传是针对分片上传任务的操作,通过调用AbortMultipartUpload接口通知OSS不再接受特定UploadId的分片上传任务。

实现步骤

  1. 获取分片上传任务的UploadId
    • UploadId是在调用InitiateMultipartUpload初始化分片上传后返回的结果。
  2. 调用AbortMultipartUpload接口取消分片上传任务。
  3. 确保在取消任务后清理本地缓存的断点记录(可选)。

示例代码

以下是取消分片上传的示例代码:

OSSAbortMultipartUploadRequest * abort = [OSSAbortMultipartUploadRequest new];
// 填写Bucket名称,例如examplebucket。
abort.bucketName = @"examplebucket";
// 填写文件完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
abort.objectKey = @"exampledir/exampleobject.txt";
// 填写uploadId。uploadId来源于调用InitiateMultipartUpload完成初始化分片之后的返回结果。
abort.uploadId = @"0004B999EF518A1FE585B0C9****";

OSSTask * abortTask = [client abortMultipartUpload:abort];

[abortTask waitUntilFinished];

if (!abortTask.error) {
    OSSAbortMultipartUploadResult * result = abortTask.result;
    NSLog(@"Cancel multipart upload success, UploadId: %@", result.uploadId);
} else {
    NSLog(@"Cancel multipart upload failed, error: %@", abortTask.error);
    return;
}

注意事项

  • 取消分片上传会通知OSS清理与指定UploadId相关的所有分片数据。
  • 如果希望保留断点记录以便后续续传,需设置deleteUploadIdOnCancelling参数为NO
    resumableUpload.deleteUploadIdOnCancelling = NO;
    

    重要提示:如果不设置此参数,默认值为YES,表示取消任务时会同步清理已上传到服务器的分片。


3. 断点续传中的取消操作

在断点续传场景下,取消上传任务时需要注意以下事项: 1. 默认情况下,取消任务会清理已上传到服务器的分片。 2. 如果希望保留断点记录以便后续续传,需指定断点记录的保存文件夹并设置deleteUploadIdOnCancelling参数为NO

NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
resumableUpload.recordDirectoryPath = cachesDir;
resumableUpload.deleteUploadIdOnCancelling = NO;

总结

  • 中断上传适用于所有上传任务,但不会清理已上传的分片。
  • 取消分片上传适用于分片上传任务,会通知OSS清理相关分片数据。
  • 在断点续传场景下,取消任务时可通过设置deleteUploadIdOnCancelling参数保留断点记录。

根据实际需求选择合适的取消方式,确保上传任务能够灵活管理。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: