处理多个文件(图像)上传到 AWS S3 Swift

2023-12-28

我一直在尝试研究从 iOS 应用程序上传多个图像到 AWS S3 的最佳方法。我在 StackOverflow 上看到过一些类似的问题,其中最接近“答案”的问题就在这里:link https://stackoverflow.com/questions/41705839/efficient-way-to-upload-multiple-images-to-s3-from-ios。虽然我不完全理解线程/调度组/等,但我尝试了很多方法来实现上传多个图像的方法。我的设想是这样的:

  1. 调用方法上传多张图片并传入多张图片
  2. 迭代图像,通过调用特殊方法创建新的AWS S3上传请求(调用前输入调度组)
  3. 在上传方法中使用完成处理程序根据是否发生成功/错误返回 true/false(在完成处理程序中,离开调度组)
  4. 等待调度组任务完成,然后使用通知处理后续步骤

我沿着这些思路创造了类似的东西;然而,它似乎并没有 100% 发挥作用。我已经实现了一个 while 循环来检查“retryCount”,在警告用户上传请求不成功之前尝试 x 次。下面是我目前拥有的代码 - 请告诉我这是否正确处理流程/正确处理大量请求/等等。非常感谢!

static func uploadImages(imagesToUpload: [UIImage], complete: @escaping (String?) -> ()) {
    let folderKey = UUID().uuidString
    var retryArray = [String: Data]()
    var retryCount = 0

    for i in 0..<imagesToUpload.count {
        retryArray.updateValue(UIImagePNGRepresentation(imagesToUpload[i])!, forKey: "image\(i)")
        //retryArray["image\(i)"] = UIImagePNGRepresentation(imagesToUpload[i])
    }

    let imageGroup = DispatchGroup()
    imageGroup.enter()

    if(retryArray.keys.count > 0) {
        while(retryCount < 3) {
            //Iterate through retry array
            let uploadGroup = DispatchGroup()

            for (key, val) in retryArray {
                print("Trying to upload: \(key)")

                uploadGroup.enter()
                singleUpload(imageToUpload: val, keyVal: "public/\(folderKey)/\(key).png", complete: { (err) -> Void in
                    //If no error, remove key/value pair
                    if(!err) {
                        print("\(key) was successfully uploaded")
                        retryArray.removeValue(forKey: key)
                    }
                    uploadGroup.leave()
                })

            }
            uploadGroup.wait()
            if(retryArray.keys.count == 0) {
                break
            } else {
                retryCount = retryCount + 1
            }

        }
        imageGroup.leave()
    } else {
        imageGroup.leave()
    }

    imageGroup.notify(queue: DispatchQueue.main) {

        if(retryArray.keys.count > 0) {
            print("the images could not be uploaded")
            complete(nil)
            //execute code to delete folder in aws s3
        } else {
            print("all images uploaded successfully")
            complete(folderKey)
        }
    }
}

static func singleUpload(imageToUpload: Data, keyVal: String, complete: @escaping (Bool) -> ()) {

    var data: Data = Data() // Data to be uploaded
    data = imageToUpload

    let expression = AWSS3TransferUtilityUploadExpression()
    var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
    completionHandler = { (task, error) -> Void in
        //DispatchQueue.main.async(execute: {
            if let error = error {
                complete(true)
            }
            else{
                complete(false)
            }
        //})
    }

    let transferUtility = AWSS3TransferUtility.default()

    transferUtility.uploadData(data,
                               bucket: s3BucketName,
                               key: keyVal,
                               contentType: "image/png",
                               expression: expression,
                               completionHandler: completionHandler).continueWith {
                                (task) -> AnyObject! in
                                if let error = task.error {
                                    print("Error: \(error.localizedDescription)")
                                    complete(true)
                                }

                                if let _ = task.result {
                                    // Do something with uploadTask.
                                }
                                return nil;
    }
}

另外 - 我很好奇是否有更好的方法来解决这个问题。不是创建要上传的项目列表,而是迭代(基于 retryCount x 次),尝试上传项目(并删除成功的项目),然后向用户呈现结果(如果 1,则全有或全无)图片未上传)。有没有更好的用户体验/效率途径?谢谢你!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理多个文件(图像)上传到 AWS S3 Swift 的相关文章

  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 如何快速更改按钮图像?

    我正在开发一个有按钮的应用程序 该按钮没有文本 图像或背景 所以我想做的就是在viewDidLoad函数中给它一个图像 这就是我所拥有的 IBOutlet var tapButton UIButton override func viewD
  • NSDateFormatter 返回错误的日期 + Swift

    Code let dateString 2016 04 02 var formatter NSDateFormatter NSDateFormatter formatter timeZone NSTimeZone abbreviation
  • UITextFieldDelegate 与 UITextField 控件事件

    如果我想处理 UITextField 的更改 例如用户在其中键入 看起来这可以通过将委托分配给该文本字段 然后让委托实现 shouldChangeCharactersInRange 来完成 或者通过将目标添加到文本字段并处理 UIContr
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • 我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?

    我想在我的应用程序中呈现丰富的链接 并将这些数据发送到我的服务器 我需要访问视图内的图像LPLinkView https developer apple com documentation linkpresentation lplinkvi
  • 如何请求用户开启定位服务

    我需要我的应用程序来访问用户的当前位置 它在应用程序开始时检查用户是否已设置 如果没有 我需要应用程序显示提示以使其使用位置服务 就像警报视图一样 点击按钮 它应该会带您进入 iPhone 上的位置服务屏幕 您可以通过以下代码检查 loca
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • iOS UIButton 带有圆角和背景 bug

    我发现圆形 UIButton 存在一个奇怪的问题 这是我创建此按钮的代码块 let roundedButton UIButton type System roundedButton frame CGRectMake 100 100 100
  • Swift 3.0 Pin 颜色注释在 MapView 中没有改变

    我有兴趣根据案例场景更改注释的图钉颜色 在一个函数中 我发送了一个数组 用于确定引脚注释的颜色 到目前为止 我已经设置了一个名为 ColorPointAnnotation 的子类 它将确定 pinColor 然后 在 switch 语句中
  • 将 Xcode 的测试类助理编辑器与 Swift 类结合使用

    在 Xcode 中工作时 在助理编辑器中提取单元测试用例通常会很好 目前 我一直在手动选择测试文件 但我看到助理编辑器有一个选项Test Classes 我试图让这个选项自动提取我的测试文件 但我似乎无法让它工作 是否需要某种配置 它不适用
  • 为什么我的 tableView 函数运行了 3 次?

    我有一个 UITableView 并且有执行它所需的方法之一 func tableView tableView UITableView numberOfRowsInSection section Int gt Int println sec
  • iPhone 快照,包括键盘

    我正在寻找拍摄整个 iPhone 屏幕 包括键盘 的正确方法 我找到了一些截取屏幕的代码 CGRect screenCaptureRect UIScreen mainScreen bounds UIView viewWhereYouWant
  • 我可以知道 requireGestureRecognizerToFail 到底会做什么吗?

    谁能告诉我下面的代码行到底会做什么 我已经提到过Apples https developer apple com library ios documentation uikit reference UIGestureRecognizer C
  • 如何将音乐从我的应用程序切换到 iPod

    我在用MusicPlayerController我的应用程序中的对象来播放音乐 我知道当 iPhone ipod 应用程序终止时 可以继续播放我的应用程序音乐 我该怎么做 这涉及到一些事情 您必须在两种音乐播放器之间进行选择 应用程序音乐播
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • 将 iPhone 上的 stderr 写入文件和控制台

    我正在遵循答案中的建议here https stackoverflow com questions 5179108 iphone how to read application logs from device用于将 iOS 设备上的 NS
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector

随机推荐

  • mgo:如何更新文档中的特定数组

    我的数据库中有这个文档 id 53dc97bf91f1f933e15d6fb1 attributes chilled false flammable false food false fragile false frozen false h
  • 如何使用 Graphviz 记录强制直线样条

    有多个问题 例如here https stackoverflow com questions 3006792 straight edge between clusters in graphviz here https stackoverfl
  • 动画高度时阴影/单元格闪烁

    我的单元格上有阴影问题 点击 GIF 查看动画 当我打电话时影子会闪烁beginUpdates cell tappedParentView subscribe onNext weak self in guard let self self
  • 如何在 Web 浏览器上播放从 RestAPI 接收的二进制数据(视频文件)

    我们将一些视频文件以二进制形式存储在 NoSQl 数据库中 NoSQL 数据库公开 Rest API 以从数据库读取数据 我们能够从 RestAPI 接收二进制数据 没有文件扩展名 但 Web 浏览器开始下载文件而不是在浏览器中播放它 我想
  • 用于 Web 应用程序的客户端 Java 与 (Adobe) Flash,选择什么以及何时选择

    几年前 客户端 Java 不适合 Web 开发 因为很大一部分 Web 用户没有安装 Java 具体数字不记得了 10 以上 现在我看到一个大型网站的 Google Analytics 统计数据 它表明 gt 98 的用户安装了 Java
  • gititor分支权限

    是否可以使用 Gitorious 设置分支权限 我希望 master 拥有与其他分支不同的权限 答案是不 不过 如果您想使用 Gitorious 设置权限 可以选择创建单独的存储库 并且可以根据需要对这些存储库设置权限 现在取决于您是实施每
  • 使用另一个矩阵中的 id 进行子集化矩阵

    我想使用第二个矩阵中的数据对一个矩阵的数据进行子集化 一个矩阵的列被标记 例如 area1 lt c 9836374 635440 23018 833696 936079 1472449 879042 220539 870581 21741
  • 检查 JavaScript 中是否存在变量

    我知道 JavaScript 中有两种方法可以确定变量是否存在而不是 null false empty 1 if typeof variableName undefined variableName 2 if window variable
  • 什么是强制表单出现在前面的有效方法?

    使用 Windows C 应用程序强制表单位于所有其他应用程序前面的有效方法是什么 强有力地强制用户单击任务栏中的应用程序窗口图标
  • 有没有办法获取Spring boot中所有配置属性的名称?

    我对 Spring 真的很陌生 我使用的是spring boot提供的外部配置功能 它工作得很好 我在几个配置类中使用了它 通常只使用默认值 现在我想了解我使用的配置属性的概述 这意味着我需要知道设置的所有属性 Value 或 或 与 Co
  • Android 扩展文件 - 测试时未找到资源

    这是我的包名称 com abc ss 现在我已经在 mnt sdcard Android obb com abc ss main 2 com abc ss obb 中手动创建了一个包名为 com abc s 的文件夹 但是当我运行示例应用程
  • 从 gmail-api 获取发件人电子邮件

    我正在使用 gmail api 但无法获取发件人的电子邮件 我说的是电子邮件的 完整 格式 我认为发件人的电子邮件实际上是使用 gmail 的网络界面写在 发件人 字段中的电子邮件 这种完整格式的标头通常包括 X Original Auth
  • 我应该在清单中声明 MainFragmentDemoActivity 吗?

    我正在尝试学习片段 我正在单击片段类 我的应用程序崩溃了 我已在清单中声明了它 但是为什么会发生这种情况 我的菜单类 public class Menu extends ListActivity String classes Spinner
  • 网页上某些缩放级别的边框

    我们的公司网站正在经历一些奇怪的恶作剧 当您在台式电脑或笔记本电脑上查看它时 它在任何浏览器上看起来都很好 然而 当您在移动设备上浏览网站时 您会在 iOS 上的 Safari 和 Android 上的 Chrome 和 Android 2
  • libGDX:如何检查演员是否存在于舞台上

    如何检查演员是否已被移除并不在舞台上 像这样 if actor isRemoved enter code here 来自文档 https libgdx badlogicgames com nightlies docs api com bad
  • 在 EC2 主节点上初始化 Ray 时出错

    我正在使用 Ray 在 AWS EC2 上的 Ubuntu 14 04 集群上运行并行循环 以下 Python 3 脚本在我的本地计算机上运行良好 只有 4 个工作线程 省略了导入和本地初始化 ray init initialize Ray
  • 如何从 XAML 内部访问嵌套命名空间?

    我有一个包含 2 个项目的 WPF 应用程序 一个用于 ViewModels MyApp Core 另一个用于 Views MyApp 在 Views 和 ViewModels 内部 我有不同的嵌套命名空间 例如 MyApp Core Vi
  • shared_from_this 导致 bad_weak_ptr

    我正在尝试在 asio 中保留已连接客户端的列表 我已经改编了文档中的聊天服务器示例 http www boost org doc libs 1 57 0 doc html boost asio example cpp03 chat cha
  • 如何在我自己的android库模块中添加crosswalk webview?

    我正在开发一个 Android 库模块 其中必须包含 Crosswalk Webview 我使用 Github Sonatype 创建库 https github com sonatype https github com sonatype
  • 处理多个文件(图像)上传到 AWS S3 Swift

    我一直在尝试研究从 iOS 应用程序上传多个图像到 AWS S3 的最佳方法 我在 StackOverflow 上看到过一些类似的问题 其中最接近 答案 的问题就在这里 link https stackoverflow com questi