- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 AWS SDK for iOS在 iOS 12 的快速应用程序中。我的应用程序必须列出 AWS S3 存储桶中的文件并下载其中的一些文件。列表文件操作运行良好,我成功地控制了它的超时。我没有成功完成下载任务。我的代码如下:
let credentialProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "<pool-id>")
let configuration = AWSServiceConfiguration(region: AWSRegionType.APSoutheast2, credentialsProvider: credentialProvider)
configuration?.timeoutIntervalForRequest = 30.0
configuration?.timeoutIntervalForResource = 86400
let transferUtilityConfiguration = AWSS3TransferUtilityConfiguration.init()
transferUtilityConfiguration.timeoutIntervalForResource = 86400
transferUtilityConfiguration.retryLimit = 1
AWSS3TransferUtility.register(with: configuration!, transferUtilityConfiguration: transferUtilityConfiguration, forKey: "com.mykey")
transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: "com.mykey")
let bucket = "com.mybucket"
transferUtility.configuration.maxRetryCount = 1
let urlForSavingFile = URL.init(fileURLWithPath: "")
transferUtility.download(to: urlForSavingFile, bucket: bucket, key: self.latestFileOnServer.key, expression: expression, completionHandler: self.completionHandler).continueWith { (task) -> AnyObject? in
if let error = task.error {
NSLog("Error: %@",error.localizedDescription);
DispatchQueue.main.async(execute: {
statusLabel.text = "Failed"
})
}
if let _ = task.result {
self.refDownloadTask = task.result
self.refDownloadTask?.setCompletionHandler(self.completionHandler!)
methodStart = Date.init()
let formatter = DateFormatter.init()
formatter.dateFormat = "dd' 'MMM' 'YYYY' - 'HH:mm:ss"
formatter.locale = Locale.init(identifier: "Europe / Rome")
let italyDate = formatter.string(from: methodStart)
print("Download started at \(italyDate)")
DispatchQueue.main.async(execute: {
//statusLabel.text = "Downloading..."
})
NSLog("Download Starting!")
// Do something with uploadTask.
}
return nil;
}
如果我等待文件完成下载,完成处理程序会被正确调用,但如果我使用网络链接调节器关闭网络,传输将永远挂起并且永远不会调用完成处理程序。任何帮助深表感谢。谢谢
最佳答案
经过多次测试,我成功找到了解决方案,让SDK尊重超时。在我的测试中,最初,我对命名约定有点困惑:
timeoutIntervalForResource
是传输可以花费的最长时间,无论任何成功/失败。这与 AWS SDK 开箱即用。
timeoutIntervalForRequest
是我们感兴趣的值,它是网络丢失后任务等待附加数据的时间间隔。它的定时器是从最后一个数据包接收到的开始安排的。正如您在问题和评论中看到的那样,AWS SDK 似乎没有遵守它。
此命名约定与 Apple Cocoa USURLSession 系列类相同。在我的研究过程中,我遇到了这个 answer .对于将其配置实例化为后台配置的 URLSession,这种行为似乎一直存在。这不是不当行为,它只是自 iOS 8 以来后台下载的新标准。
现在,解决方案。通过在 AWS SDK Objective-C 代码中调试(是的,他们提供了完整的代码)我找到了位置。如果你打开 AWSS3TransferUtility.m 文件,在第 400 行左右,你会发现,在这个方法中:
- (instancetype)initWithConfiguration:(AWSServiceConfiguration *)serviceConfiguration
transferUtilityConfiguration:(AWSS3TransferUtilityConfiguration *)transferUtilityConfiguration
identifier:(NSString *)identifier
completionHandler: (void (^)(NSError *_Nullable error)) completionHandler {}
那些声明:
//Create the NS URL session
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:_sessionIdentifier];
configuration.allowsCellularAccess = serviceConfiguration.allowsCellularAccess;
configuration.timeoutIntervalForResource = transferUtilityConfiguration.timeoutIntervalForResource;
为了让它工作,将第一条语句替换为:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
现在,在您的代码中:
let credentialProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "<pool-id>")
let configuration = AWSServiceConfiguration(region: AWSRegionType.APSoutheast2, credentialsProvider: credentialProvider)
configuration?.timeoutIntervalForRequest = 30.0
configuration?.timeoutIntervalForResource = 86400
SDK 将在网络丢失 30 秒后触发完成处理程序并返回 -1001 错误。
我只测试了 transferutilitydownloadtask,但它应该也适用于上传。我知道这个解决方案不是防弹的,因为它没有考虑 session 配置标识符,但我会继续努力。此外,该解决方案意味着更改 AWS SDK 代码,但只需要一行代码。更改只是使 AWSS3TransferUtility 创建标准 URLSessionConfigurations 而不是后台配置。这可能还有其他副作用需要考虑。
关于ios - 在使用 Amazon iOS SDK 的 swift iOS 应用程序中,如何为 AWSS3TransferUtility 下载操作设置自定义超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55856944/
我正在尝试理解以下文档: TransferUtility.UploadDirectory 文档没有描述上传的错误情况。通常我会猜测类似 System.Net.Http.HttpRequestExcep
当我尝试启动将对象上传到 S3 存储桶的 TransferUtility 时,出现以下错误: Unable to start service Intent { cmp=com.ntt.vault/co
我正在尝试从 s3 存储桶下载文件,但我不断收到非法状态异常,并显示消息“传输失败”。上传效果很好。这是我的代码和堆栈跟踪。有人知道可能出了什么问题吗? (最后一点,image.url 不是一个完整的
我正在尝试使用以下代码将图像上传到亚马逊 (AWS SDK 2.3.0) s3 CognitoCachingCredentialsProvider credentialsProvide
我的要求是在用户希望时取消上传。我正在按照 TransferUtility 文档来设置和上传视频、显示进度、保留状态,即使应用程序在后台也是如此。我找不到取消 uploadTask 的方法。 { le
我正在尝试在已启动的服务中使用适用于 S3 的 AWS Android SDK。我对 SDK 和服务都有点陌生。我非常有信心 Transfer Utility 也在运行一项服务。 Handler (a
我收到很多文件没有上传到我的 AWS 存储桶,但下面的代码始终显示完整。有人知道这是怎么回事吗?如果上传总是完成,我该如何确定上传是否失败?我确实看到了一些关于使用 transferutility.E
是否可以使用 AmazonS3 TransferUtility 类进行分段上传,并且在上传失败时也能够恢复。 最佳答案 不,似乎不可能使用此类。 您必须使用较低级别的类手动执行此操作,并在(持久)数据
您好,我已尝试将虚拟文本文件上传到 Amazon S3。但是它不起作用,但日志生成了一个 id。当我刷新 Amazon S3 存储桶控制面板时。文件尚未传输。 public class AmazonS
我正在尝试使用 TransferUtility 将文件上传到 S3。我通过 ACTION_GET_CONTENT Intent 获取 Uri。Intent 的结果类似于 content://com.a
我正在使用 S3 TransferUtility 上传文件,我面临的问题是当应用程序关闭时它会停止上传。我希望它继续在后台运行上传,为此我开始在 WorkManager 中上传,但它仍然完成了上传。问
我有一组定期上传到 Amazon S3 存储桶的图像。我需要在我的应用程序中显示这些图像。与手动编写代码来处理多线程下载和缓存等方面不同,我想使用 Fresco 来执行此操作,因为我已经将它用于我的应
我正在尝试从 UIDocumentPickerView 中选择一些文件并使用 TransferUtility 上传到 AWS S3。在这里,我无法将文件名、大小和文件数据传递给上传功能。此外,上传功能
使用 TransportUtility 类将文件上传到 S3 时,可以选择使用 FilePath 或输入流。我正在使用分段上传。 我正在上传各种各样的东西,其中一些是磁盘上的文件,另一些是原始流。我目
所以我正在编写一个迁移应用程序,以从我们的本地存储中获取一些数据并将其上传到亚马逊。一切正常,除非我进入大于 15 兆(兆,是的,不是千兆)的文件,应用程序卡住。 这是在 C# 中,非常简单。 var
我已经遵循了 https://www.youtube.com/watch?v=UMgApUhg7ic 中的一些教程将图像上传到我的 s3 存储桶。 本教程在 iOS 模拟器上运行得很好,但在我的测试
我有 localstack ( https://github.com/localstack/localstack ) 正在运行并且能够使用 aws s3 cli 将文件上传到它。 我希望能够将 .NE
我得到的错误是: The thread 0xffc has exited with code 0 (0x0). Exception thrown: 'System.IO.IOException' in
我知道有两种方法可用于在 AWS S3 中上传文件(即 PutObject 和 TransferUtility.Upload)。有人可以解释一下使用哪一个吗? 仅供引用,我的文件大小从 1kb 到 2
我是一名优秀的程序员,十分优秀!