ios 拍照上传到服务器_iOS 上传相册的资源到服务器的坑

本文介绍了在iOS应用中,用户选择2GB以内的视频和照片上传到服务器时遇到的问题。在iOS12及以上版本,通过PHImageManager获取资源路径并上传工作正常,但在iOS12以下版本,照片上传因权限问题失败,而视频上传在异步操作时会出现'File doesn't exist'错误。解决方案包括在上传过程中保持AVAsset的强引用,以确保文件读取权限,待上传完成后释放AVAsset。
摘要由CSDN通过智能技术生成

需求是这样的。用户可以一次在本地选择 最多 2G的视频加照片上传到服务器

由于文件太大,只能通过获取文件的本地路径,然后通过OSS直接上传到阿里云。

刚开始的做法是:

通过 框架获取的视频信息。

之后通过

[[PHImageManager defaultManager] requestAVAssetForVideo:asset

options:videoOptions resultHandler:^(AVAsset * _Nullable avasset,

AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {

}];

[[PHImageManager defaultManager] requestImageDataForAsset:asset

options:options resultHandler:^(NSData * _Nullable imageData,

NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {

}];

获取资源数据,之后截取 info[@"PHImageFileSandboxExtensionTokenKey"] 然后一系列操作之后,获取资源的 本地路径。然后开始上传。

刚开始在iOS12的手机上,针对照片和视频都能实现上传。

后来经过测试,在iOS12 以下的系统版本。

当上传的是照片时,会因为权限问题,无法访问本地路径对应的文件。

错误信息类似于

Error Domain=NSCocoaErrorDomain Code=257 "

The operation couldn’t be completed. (Cocoa error 257.)"

UserInfo=0x17762480 {NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0291.PNG,

NSUnderlyingError=0x17741d10 "The operation couldn’t be completed. Operation not permitted"}

这个可以解决,因为一次只开启三个上传任务。可以在上传的时候,获取图片的data,缓存到内存里进行上传。

后来神坑出现了。

当iOS12以下的设备上传的是视频时。可以通过路径访问到视频文件,

但是一旦开始异步上传路径对应的文件。

OSS 会抛出以下错误。

ErrorMessage=File doesn't exist

经过大量的测试,得出结论。

上传视频的时候,直接引用路径是不够的。

首先

[[PHImageManager defaultManager]requestAVAssetForVideo:options:resultHandler:]

的方法里面会返回出 AVAsset 类的对象。我们可以通过 AVAsset 播放视频。同时也会有对该文件读的权限。

但是一旦 AVAsset 对象释放了, 读的权限也就没了。

因此需要对AVAsset进行强引用,上传完成之后再释放。就OK了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值