我在我的 iOS 应用程序中使用 AWS S3TransferUtility 的uploadUsingMultipart(fileURL, bucket, ...)函数将视频文件上传到 S3 存储桶。只要应用程序处于前台,上传就会非常快。但是一旦应用程序进入后台,上传过程就会非常缓慢,并且需要太多时间才能完成。
例如,我在互联网连接上使用 100 MB 的文件进行了测试,上传速度为 10 Mbps,当应用程序在前台时使用多部分上传需要 35 秒,但使用多部分上传同一文件需要 14 分 40 秒该应用程序在后台。
有没有办法在后台加快上传过程?
amazon-s3 ios swift awss3transfermanager awss3transferutility
我的代码如下所示:
final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
final TransferUtility util = TransferUtility.
builder().s3Client(s3Client).context(context).build();
Run Code Online (Sandbox Code Playgroud)
从'com.amazonaws:aws-android-sdk-s3:2.7.5'升级到'com.amazonaws:aws-android-sdk-s3:2.11.0'时,即使上传仍然有效:
E/nsferNetworkLossHandler: TransferNetworkLossHandler is not created. Please call `TransferNetworkLossHandler.getInstance(Context)` to instantiate it before retrieving
E/UploadTask: TransferUtilityException: [com.amazonaws.mobileconnectors.s3.transferutility.TransferUtilityException: TransferNetworkLossHandler is not created. Please call `TransferNetworkLossHandler.getInstance(Context)` to instantiate it before retrieving]
Run Code Online (Sandbox Code Playgroud)
当我更改代码以包括TransferNetworkLossHandler时:
TransferNetworkLossHandler.getInstance(context);
final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
final TransferUtility util = TransferUtility.
builder().s3Client(s3Client).context(context).build();
Run Code Online (Sandbox Code Playgroud)
不做任何事情,我再也没有错误。
但是,这不是此错误消息的预期目的。它告诉您使用TransferNetworkLossHandler,但是没有有关如何使用它的文档。
如果上传不起作用,我只想向用户显示错误(例如Toast或AlertDialog)。所以我根本不需要处理程序。但是我也不希望每次都将错误消息写入日志。另外,我也不想使用这种简单的解决方案,即仅获取一个实例而不对其执行任何操作。
在我的情况下,此处理程序的正确用法是什么?
我的要求是在用户希望时取消上传。我正在关注TransferUtility文档以设置和上传视频,显示进度,即使应用程序在后台也能保持状态。我找不到任何取消上载任务的方法。
{
let uploadRequest = AWSS3TransferManagerUploadRequest()
let transferUtility = AWSS3TransferUtility.default()
var completionHandler : AWSS3TransferUtilityUploadCompletionHandlerBlock?
var uploadTask : AWSTask<AWSS3TransferUtilityUploadTask>?
let expression = AWSS3TransferUtilityUploadExpression()
}
func startUpload() {
uploadTask = transferUtility.uploadFile((uploadRequest?.body)!,
bucket: (uploadRequest?.bucket)!,
key: (uploadRequest?.key)!,
contentType: "video/mov",
expression: expression,
completionHander: completionHandler).continue({ (task) -> AnyObject! in if let error = task.error {
print("Error: \(error.localizedDescription)")
}
if let _ = task.result {
}
return nil;
}) as? AWSTask<AWSS3TransferUtilityUploadTask>
}
Run Code Online (Sandbox Code Playgroud)
我想知道我应该在任务上使用哪个继续块,以及如何像执行TransferManager任务一样执行类似uploadTask.cancel()之类的事情。
我有一个 S3Service,它是一个管理所有 S3 相关上传和下载的单例。当我上传第一个图像时,它工作正常,但如果我尝试连续上传图像,它会给我这个警告,并且完成块永远不会被调用。
具有标识符的后台 URLSession
com.amazonaws.AWSS3TransferUtility.Identifier.TransferManager
已存在。
这就是我上传方法的样子:
if let data = image.jpegData(compressionQuality: 0.5) {
let transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: S3Service.TRANSFER_MANAGER_KEY)
transferUtility.uploadUsingMultiPart(data: data, bucket: EnvironmentUtils.getBucketName(), key: filename, contentType: "image/jpg", expression: nil, completionHandler: { task,error in
if let error = error {
print(error.localizedDescription)
} else {
print("Image upload success")
}
})
}
Run Code Online (Sandbox Code Playgroud) amazon-s3 nsurlsession swift awss3transferutility aws-sdk-ios
我一直在尝试将文件上传到s3存储桶.但该文件永远不会公开查看.我必须手动将存储桶中的文件/文件夹公开(对于每次上传)才能查看.
有没有办法上传具有默认权限的Android文件(位图),以供公开查看.如果可能的话,我更愿意以编程方式执行此操作.我检查了s3文档,找不到任何有用的东西.