同时选择了多个图片,然后循环上传,结果只有一部分成功,另外的报错如下:
UserInfo={__name=Error, HostId=120.77.166.49, BucketName=product_F793D9FC-8A15-4D51-9F86-5E6D71FD8778.jpg, Message=The specified bucket is not valid., Code=InvalidBucketName,
代码如下:
let ossClient = OSSClient.init(endpoint: self.endPoint, credentialProvider: ossProvider!)
ossClient.clientConfiguration = conf
//let queue = OperationQueue()
// queue.maxConcurrentOperationCount = self.upload_imageDatas.count
var index = 0
for imageData in self.upload_imageDatas{
// let operation = BlockOperation { () -> Void in
let put = OSSPutObjectRequest()
// required fields
put.bucketName = self.bucketName!
let fileName = CommonUtil.getUUID()
put.objectKey = "product-\(fileName).jpg".lowercased()
put.uploadingData = imageData as Data!
print("bucket name: " + put.bucketName)
let ossTask = ossClient.putObject(put)
ossTask.waitUntilFinished()
if (!(ossTask.error != nil)) {
print("upload success")
self.updateAvatarToServer(productId: productId, fileName: fileName)
} else {
print(ossTask.error!)
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的错误信息和代码片段,问题出在尝试上传图片到OSS(阿里云对象存储服务)时,部分请求报错"The specified bucket is not valid.",这意味着您使用的Bucket名称不合法或者不存在。
检查Bucket名称:
self.bucketName
变量的值是正确的,且与您在阿里云OSS控制台中创建的Bucket名称完全一致。Bucket名称必须全局唯一,且符合命名规则:只能包含小写字母、数字和短横线(-),必须以小写字母或数字开头和结尾,长度在3到63个字符之间。环境配置问题:
权限验证:
ossProvider
设置)具有向该Bucket上传文件的权限。如果权限不足,也会导致操作失败。异步处理:
ossTask.waitUntilFinished()
会导致当前线程等待直到上传完成,这在多文件上传场景下并不理想。可以考虑使用异步回调或者OperationQueue
来并发处理这些上传任务。错误处理细化:
InvalidBucketName
错误,可以直接提示用户检查Bucket名称。// 假设ossProvider已正确初始化
let ossClient = OSSClient.init(endpoint: self.endPoint, credentialProvider: ossProvider)
ossClient.clientConfiguration = conf
// 使用OperationQueue来并发执行上传任务
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 5 // 根据实际情况调整并发数
for imageData in self.upload_imageDatas {
let operation = BlockOperation() {
let put = OSSPutObjectRequest()
put.bucketName = self.bucketName
let fileName = CommonUtil.getUUID()
put.objectKey = "product-\(fileName).jpg"
put.uploadingData = imageData as Data
let ossTask = ossClient.putObject(put)
ossTask.progressBlock = { progress in
// 可以在这里处理上传进度
}
ossTask completionHandler: { (task, error) in
if let error = error {
print("Upload failed with error: \(error)")
// 处理错误,如InvalidBucketName等
} else {
print("Upload success")
self.updateAvatarToServer(productId: productId, fileName: fileName)
}
}
ossClient.upload(ossTask) // 或者直接ossTask.resume(),具体方法名请参考实际SDK文档
operation.addDependency(ossTask)
}
queue.addOperation(operation)
}
请注意,上述代码是基于假设的示例,具体实现细节可能需要根据您使用的阿里云OSS SDK版本和Swift语言特性进行调整。务必参考最新的阿里云OSS SDK for iOS文档来确保代码的正确性。