目前,我使用亚马逊s3存储所有对象,如图片和视频。我使用IOS AWS SDK上传对象。
我的申请流程
我面临的问题是,AWS上传+调用API需要花费很多时间。这确实是一个糟糕的用户体验。大多数图像大致小于5 MB
我的解决方案
调整图片大小,但视频呢?
用户点击“继续”后,而不是执行AWS上传+调用 API,为什么不把它作为不同屏幕上的背景,这样做 用户不需要等待加载指示符
解决这个问题的方法是什么?感谢
答案 0 :(得分:1)
您的问题可以改为问题"如何最大程度地减少上传延迟?"
最重要的是将AWS用于所有应用基础架构。
如果您使用S3作为文件存储并从外部服务器上传,则由于网络延迟,您将面临对上传速度的巨大影响。
您可能需要考虑的另一个解决方案是使用S3后操作,而不是在操作中。
这只是意味着您的服务器接受上传并将URL返回给用户,其中独立后台进程与用户请求之外的S3同步。
在这种情况下,您将拥有 User - >服务器 - >用户
现在你有用户 - >服务器 - > S3 - >用户
答案 1 :(得分:0)
当速度和用户体验至关重要时,您可能希望使用AWS cloudfront之类的内容投放网络服务。
当带宽和存储的低成本比访问速度更为关键时,Amazon S3是理想的选择,而Cloudfront则是关于访问速度的全部。
请参阅this链接,了解如何使用S3存储桶设置cloudfront。
答案 2 :(得分:0)
当您的用户在全球分发时,您应启用并使用S3 Transfer Acceleration。这将减少不靠近您的桶区域的用户的上传时间。
除此之外,上传5 MB需要一些时间,具体取决于您的移动连接。因此,您应该在客户端上调整图像大小,然后您可以考虑提前开始上传,例如当用户输入详细信息时,上传已在后台运行。
答案 3 :(得分:0)
为了改善用户体验,您应该创建一个以异步方式发出所有请求的类,并在请求状态更改时生成事件。这将允许用户不要等到文件加载并继续使用该应用程序。
此类的一些伪代码:
class FileUploader {
uploadingFiles: [String]
func uploadFile(path: String) -> Task {
uploadingFiles.add(path)
runInBackground({
// make all requests here
runInMainThread({
uploadingFiles.remove(path)
if error {
NSNotificationsCenter.default().post('UploadingError', error)
} else {
NSNotificationsCenter.default().post('FileUploaded', path)
}
})
})
}
}
这个类不应该由某个特定的屏幕创建,并且可以存储在例如AppDelegate
中。每个屏幕始终可以知道现在正在上传的文件数量,以及加载完成后(通过订阅NSNotificationCenter
中的ViewWillAppear
个事件并取消订阅ViewDidDisappear
)。但是,处理错误会更容易在AppDelegate
订阅一次。
您甚至可以在屏幕底部(可以从应用程序的各个位置看到)上传状态。
关于将文件上传到s3 - 最好将此逻辑移动到后端,以便您从客户端发出一个请求,后端进行所有必要的工作(保存到s3,保存文件链接到数据库,返回对客户端的响应)。
您只需显示文件太大的警报(如果照片为10 Mb或视频为100 Mb)。之后,如果你有足够的时间,你可以在上传之前尝试调整图片/视频的大小 - 这不是一个坏主意。
答案 4 :(得分:0)
我注意到在配置中包含“区域”可以在 7 秒内加快上传速度。
也许还有其他改进方法,我目前正在研究包括直接端点 URL。或者也许就是这样:https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html