美文网首页
阿里云OSS上传图片封装

阿里云OSS上传图片封装

作者: 晨曦之光nl | 来源:发表于2020-04-16 16:44 被阅读0次

项目中用到了阿里云对象存储,就封装了四种上传方式,按数量分为单图和多图上传,上传方式分为同步和异步上传。

// 异步上传
    func uploadImageAsync(image: UIImage,
                           uploadProgress: @escaping OSSNetworkingUploadProgressBlock,
                           uploadBlock: @escaping uploadImageBlock,
                           uploadFail: @escaping uploadImageFail) {
        let imageName = imageNameWithCurrentTimescamp()
        let put = OSSPutObjectRequest()
        put.bucketName = bucketName
        put.objectKey = imageName
        guard let data = image.wcSessionCompress()?.jpegData(compressionQuality: 1) else { return }
        put.uploadingData = data
        put.uploadProgress = {bytesSent, totalByteSent, totalBytesExpectedToSend in
            uploadProgress(bytesSent, totalByteSent, totalBytesExpectedToSend)
        }
        put.contentType = "image/jpeg"
        let putTask = client.putObject(put)
        putTask.continue({ (task) -> Any? in
            do {
                try self.client.doesObjectExist(inBucket: ThridPartyMarcos.AliOSS_BucketName.rawValue, objectKey: imageName)
                let url = "https://\(self.startPoint)/\(imageName)"
                uploadBlock(url)
            } catch {
                kLog(message: "上传失败")
                if let error = putTask.error {
                    uploadFail(error)
                }
            }
            return nil
        }, cancellationToken: nil)
    }
    
    
    // 同步上传
    func uploadImageSync(_ image: UIImage,
                          uploadProgress: @escaping OSSNetworkingUploadProgressBlock,
                          uploadBlock: @escaping uploadImageBlock,
                          uploadFail: @escaping uploadImageFail) {
        let imageName = imageNameWithCurrentTimescamp()
        let put = OSSPutObjectRequest()
        put.bucketName = bucketName
        put.objectKey = imageName
        guard let data = image.wcSessionCompress()?.jpegData(compressionQuality: 1) else { return }
        put.uploadingData = data
        put.uploadProgress = {bytesSent, totalByteSent, totalBytesExpectedToSend in
            uploadProgress(bytesSent, totalByteSent, totalBytesExpectedToSend)
        }
        put.contentType = "image/jpeg"
        let putTask = client.putObject(put)
        putTask.waitUntilFinished()
        putTask.continue({ (task) -> Any? in
            do {
                try self.client.doesObjectExist(inBucket: self.bucketName, objectKey: imageName)
                let url = "https://\(self.startPoint)/\(imageName)"
                uploadBlock(url)
            } catch {
                kLog(message: "上传失败")
                if let error = putTask.error {
                    uploadFail(error)
                }
            }
            return nil
        }, cancellationToken: nil)
    }
    
    /// 同步上传多张图片
    func uploadImagesSync(_ images: [UIImage],
                          uploadProgress: @escaping OSSNetworkingUploadProgressBlock,
                          uploadBlock: @escaping uploadImagesBlock,
                          uploadFail: @escaping uploadImageFail) {
        var imageUrls: [String] = []
        for image in images {
            let imageName = imageNameWithCurrentTimescamp()
            let put = OSSPutObjectRequest()
            put.bucketName = bucketName
            put.objectKey = imageName
            guard let data = image.wcSessionCompress()?.jpegData(compressionQuality: 1) else { return }
            put.uploadingData = data
            put.uploadProgress = {bytesSent, totalByteSent, totalBytesExpectedToSend in
                uploadProgress(bytesSent, totalByteSent, totalBytesExpectedToSend)
            }
            put.contentType = "image/jpeg"
            let putTask = client.putObject(put)
            putTask.waitUntilFinished()
            putTask.continue({ (task) -> Any? in
                do {
                    try self.client.doesObjectExist(inBucket: self.bucketName, objectKey: imageName)
                    let url = "https://\(self.startPoint)/\(imageName)"
                    imageUrls.append(url)
                    /// 为什么加 imageUrls?.count == images.count ?
                    /// 只有所有图片都上传成功才视作上传任务完成
                    if image == images.last && imageUrls.count == images.count {
                        //上传最后一张图片结束
                        uploadBlock(imageUrls)
                    }
                } catch {
                    kLog(message: "上传失败")
                    if let error = putTask.error {
                        uploadFail(error)
                    }
                }
                return nil
            }, cancellationToken: nil)
        }
    }
    
    /// 异步上传多张图片
    func uploadAsyncImages(_ images: [UIImage],
                           uploadProgress: @escaping OSSNetworkingUploadProgressBlock,
                           uploadBlock: @escaping uploadImagesBlock,
                           uploadFail: @escaping uploadImageFail) {
        
        let group = DispatchGroup()
        var imageModelArray: [uploadImageAsyncModel] = []
        
        for index in 0..<images.count {
            let image = images[index]
            var model = uploadImageAsyncModel(index: index, url: "")
            let imageName = imageNameWithCurrentTimescamp()
            let put = OSSPutObjectRequest()
            put.bucketName = bucketName
            put.objectKey = imageName
            guard let data = image.wcSessionCompress()?.jpegData(compressionQuality: 1) else { return }
            put.uploadingData = data
            put.uploadProgress = {bytesSent, totalByteSent, totalBytesExpectedToSend in
                uploadProgress(bytesSent, totalByteSent, totalBytesExpectedToSend)
            }
            put.contentType = "image/jpeg"
            let putTask = client.putObject(put)
            group.enter()
            putTask.continue({ (task) -> Any? in
                do {
                    try self.client.doesObjectExist(inBucket: self.bucketName, objectKey: imageName)
                    let url = "https://\(self.startPoint)/\(imageName)"
                    model.url = url
                    imageModelArray.append(model)
                    group.leave()
                } catch {
                    if let error = putTask.error {
                        uploadFail(error)
                    }
                    imageModelArray.append(model)
                    group.leave()
                }
                return nil
            }, cancellationToken: nil)
        }
        group.notify(queue: DispatchQueue.main) {
            //图片上传结束,图片排序
            if imageModelArray.count != images.count {
                return
            } else {
                let sortedArray = imageModelArray.sorted {
                    return $0.index < $1.index
                }
                var imageUrls: [String] = []
                for model in sortedArray {
                    if model.url.isEmpty {
                        break
                    } else {
                        imageUrls.append(model.url)
                    }
                }
                if imageUrls.count == images.count {
                    //返回图片数组url
                    uploadBlock(imageUrls)
                }
            }
        }
    }
//以时间戳命名图片名称
private func imageNameWithCurrentTimescamp() -> String {
        let timeInterval: TimeInterval = Date().timeIntervalSince1970
        let millisecond = CLongLong(round(timeInterval*1000))
        var subFolder: String = ""
        switch imageFolderType {
        case .daily:
            subFolder = "ios/daily"
        case .post:
            subFolder = "ios/post"
        default:
            subFolder = "ios/other"
        }
        let imageName = "\(subFolder)/\(millisecond).jpeg"
        return imageName
    }

相关文章

  • 封装直传阿里云存储文件上传控件

    本文目标 封装一个直传阿里云OSS云存储图片上传控件 控件效果图 上传之前 上传成功 预览图片 文件上传前后台及阿...

  • 阿里云OSS上传图片封装

    项目中用到了阿里云对象存储,就封装了四种上传方式,按数量分为单图和多图上传,上传方式分为同步和异步上传。

  • 【vue】element-ui + OSS 上传图片

    阿里云OSS图片上传,前端部分 通过NPM安装ali-oss模块: npm install ali-oss 自定义...

  • react.js 前端实现阿里云上传

    前端实现阿里云上传图片: 1,下载阿里云相关插件 npm install ali-oss --save引用方式 :...

  • 阿里云OSS图片上传实践

    目前公司里的项目用到的文件管理服务都是阿里云OSS,下面介绍下Android端上传图片到阿里云OSS的具体实践。 ...

  • Android OSS上传图片到阿里云

    Android OSS上传图片到阿里云 我所采取的上传方式为异步上传,如果需要多张图片的话,可以直接循环上传就可...

  • OSS  上传图片错误码 403

    使用OSS上传图片到阿里云时,报错误码403,提示:The OSS Access Key Id you provi...

  • 阿里云(I)

    参考资料:iOS 阿里云服务器图片上传iOS录制(或选择)视频,压缩、上传(整理)视频 拍摄 与压缩 阿里云OSS...

  • pyinstaller 出现OSError:Cannot loa

    使用阿里云储存对象OSS的SDK工具上传图片到阿里云bucket里面,用Pyinstaller打包后,运行出错,提...

  • Picture exceed the maximum allow

    在上传到阿里云图片时,上传成功后阿里云返回了地址,地址拼接后如下:https://yjmall.oss-cn-qi...

网友评论

      本文标题:阿里云OSS上传图片封装

      本文链接:https://www.haomeiwen.com/subject/iyhdvhtx.html