PHAsset + AF 网络。真机上无法上传文件到服务器

2024-01-10

目前我正在使用以下代码将文件上传到服务器

NSURLRequest *urlRequest =  [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[[entity uploadUrl]absoluteString] parameters:entity.params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

    // Get file url 
    [UploadModel getAassetUrl:entity.asset resultHandler:^(NSURL *fileUrl) {

    NSError *fileappenderror;
    // Append
                [formData appendPartWithFileURL:fileUrl name:@"data" error:&fileappenderror];

                if (fileappenderror) {
                  [Sys MyLog: [fileappenderror localizedDescription] ];
                }
            }];

        } error:&urlRequestError];

/*获取AassetUrl */

+(void)getAassetUrl: (PHAsset*)mPhasset resultHandler:(void(^)(NSURL *imageUrl))dataResponse{

    PHImageRequestOptions * requestOption = [[PHImageRequestOptions alloc] init];
    requestOption.synchronous = YES;
    requestOption.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;

        [[PHImageManager defaultManager] requestImageDataForAsset:mPhasset options:requestOption resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {

        dataResponse([info objectForKey:@"PHImageFileURLKey"]);

    }];
}

这种方法在模拟器上有效,但在真实设备上失败:空文件上传到服务器很可能是由于无法从本地存储读取而导致的。 日志显示通知

注意:沙箱:MyApp(213) 拒绝文件读取数据 /私人/var/mobile/Media/DCIM/101APPLE/IMG_1570.PNG

我相信此注释意味着应用程序无法通过指定路径访问该文件。 我还尝试了另一种上传文件的方法,即附加从请求 PHAsset 数据返回的 NSData。但这种方法在媒体文件较大的情况下不可用。因为整个文件已加载到内存中。

有什么想法吗?


你不应该使用requestImageDataForAsset(_:options:resultHandler:)对于大文件。原因是您不想将整个媒体文件加载到内存中,您将很快耗尽内存并且应用程序将崩溃。这通常意味着您不应该将其用于大图像或几乎任何视频。

根据我的经验,尝试直接从 PHAsset 资源 URL 上传将会失败。 Apple 似乎没有授予我们直接从 PHAsset 源文件上传所需的权限。参见论坛帖子here https://forums.developer.apple.com/thread/25101。这是一个痛苦,因为如果我们想上传视频,它会迫使我们使用大量额外的磁盘空间。

为了获取您要上传的视频文件的本地文件 URL,您需要使用以下任一方法:

requestExportSessionForVideo(_:options:exportPreset:resultHandler:)

or

requestAVAssetForVideo(_:options:resultHandler:)

您将使用这些方法将视频文件的副本导出到您控制的磁盘上的位置。并从该文件上传。额外功能:如果需要,这两种方法都会从 iCloud 下载文件。

查看Vimeo上传 https://github.com/vimeo/VimeoUpload有关与视频上传相关的所有内容的详细信息的库。免责声明:我是该库的作者之一。

即使您没有上传到 Vimeo 服务器,您也可以使用PHAssetExportSessionOperation and ExportOperation课程包含在Vimeo上传 https://github.com/vimeo/VimeoUpload做你想做的事。有关详细信息,请参阅存储库自述文件获取 PHAsset 的文件 url https://github.com/vimeo/VimeoUpload#obtaining-a-file-url-for-a-phasset。它还包括用于获取 ALAsset 的文件 url https://github.com/vimeo/VimeoUpload#obtaining-a-file-url-for-an-alasset.

如果您对使用不感兴趣PHAssetExportSessionOperation or ExportOperation,查看他们的实现,了解如何在幕后使用 Apple 类的详细信息。

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

PHAsset + AF 网络。真机上无法上传文件到服务器 的相关文章

随机推荐

  • 在 next.js 中触发客户端重新加载

    Scenario 索引页使用 getInitialProps 来加载数据 然后我们创建一个可以创建新数据的对话框 创建新数据后 应重新加载当前页面 Problem We use Router replace 重新加载页面 但它会触发服务器端
  • 是否可以在 html 文件的 script 标签中编译 Coffeescript 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 有没有办法将 CoffeeScript 发送到客户端浏览器并将其编译为 JavaScriptthere https stackoverflow com questions 5170473 is the
  • 批量创建需要事务原子性吗?

    我正在使用bulk create https docs djangoproject com en 3 0 ref models querysets bulk createDjango 中的方法可以一次创建多个条目 为了确保仅在没有例外的情况
  • 仅第一个 UIView 添加的视图 addSubview 显示正确的方向

    我设置了三个 ViewController 来处理三个视图 我遇到的问题是 在模拟器中 方向是 LandscapeRight 这就是我想要的 并且第一个视图在该横向视图中正确显示 但是当我移动到第二个和第三个视图时 它们会显示逆时针旋转 9
  • Boost 库格式;获取 std::string

    我想添加一些使用 boost 库格式化的字符串 如下所示 boost container vector
  • 为什么实例仅通过其头部进行匹配?

    我将首先介绍一个具体的问题 StackOverflow 的人就是这样 假设您定义了一个简单类型 data T a T a 这种类型是一个Functor Applicative and a Monad 忽略自动派生 要获取这些实例 您必须编写
  • Android 上的 OpenCV 眼动追踪

    我希望使用 OpenCV api 在 android 中进行基本的眼动追踪 我发现在 Andriod 中使用 opencv 似乎有两种方法 要么使用他们的 c 包装器 要么使用 JavaCV api 我愿意这样做 但我正在寻找一些想法或示例
  • 要捕获的正则表达式:单词 {word} word

    我正在尝试捕获 单词 word 单词 我有以下正则表达式 S s S s 它实际上捕获了这种模式 但它也捕获了单词 word 看 https regex101 com r yI64KQ 6 https regex101 com r yI64
  • 放大配置

    我已经安装了 amplify cli 当我输入 amplify configure 时 收到错误消息 amplify 不被识别为内部或外部命令 可操作程序或批处理文件 请分享您的平台 您是在 Linux Windows Powershell
  • Xcode 6 GM 与 iPhone 5s (iOS 8 GM) - 0xE8000070

    我在 iPhone 5s 型号 A1530 iOS 8 版本 12A365 上使用 Xcode 6 GM Seed 版本 6A313 我通过 USB 闪电数据线连接 iPhone 但在 Xcode 中 它显示为 iPhone 5s 不可用
  • 为什么 Foreman 在我按下 Control-C 之前不会输出一些内容?

    我刚刚开始使用 Rails 编程 看起来有两个程序可以用来在本地运行我的项目 rackup 和 foreman 我注意到的一个区别是 foreman 不会输出一些我希望看到的内容 而我会查看是否运行rackup 直到我按 ctrl c 关闭
  • 如何获取 stringbuilder 并将其转换为streamReader?

    如何获取字符串生成器并将其转换为流 所以我的 stringbuilder 必须转换为 StreamReader stream Update 我尝试使用字符串读取器 例如 StringReader sr new StringReader sb
  • Suitecrm - pdf 模板中的 php 代码

    我想在我的 pdf 模板中添加 php 代码 这是我的用例 First is I have a dropdown on my own module 然后我想要的是我的 pdf 模板 我想要基于我的下拉列表的值的 php 条件 例如 if c
  • 包括特定于 ASP.NET MVC4 视图或部分视图的脚本

    我看过很多类似的问题如何在MVC4的局部视图中添加脚本 https stackoverflow com questions 14114084 how to add a script in a partial view in mvc4 and
  • 内联这个函数还是不内联?

    我应该实现一个比较两个相似字符串的函数strcmp但忽略空白字符 所以 strcmpignorews abc a b c 应该给出相同的结果 这是我的实现 namespace void SkipWhitespace const char s
  • saveAsTextFile 到 Spark 上的 s3 不起作用,只是挂起

    我正在将 s3 中的 csv 文本文件加载到 Spark 过滤和映射记录并将结果写入 s3 我尝试了几种输入大小 100k 行 1M 行和 350 万行 前两者成功完成 而后者 350 万行 挂起在某种奇怪的状态 其中作业阶段监控 Web
  • 将 ClickHandler 与 Element 的子元素一起使用

    我需要将具有特定 ClickHandler 的锚点添加到元素中 但我的 Anchor 的 onClick 方法从未被调用 我该如何解决这个问题 Element th DOM createTH Anchor link new Anchor l
  • 使用 Azure 中的第二个(或多个)NIC 访问互联网

    我在 Azure 中有一个虚拟机 带有 Ubuntu 19 04 和 4 个网卡 每个网卡都附加了一个公共 IP 作为示例 这是第二个网卡 如您所见 它的公共 IP 为 191 234 186 19 我的目标是能够从具有不同 IP 地址的每
  • 无论如何要缩短 if ( i == x || i == y) 吗?

    我尝试缩短我的代码 从 if i x i y i z to if i x y z 我知道这种方式是错误的 因为我在日志中得到了不正确的 i 但是 有什么方法可以缩短 Objective C 中的代码吗 你可以使用switch声明 但这并不能
  • PHAsset + AF 网络。真机上无法上传文件到服务器

    目前我正在使用以下代码将文件上传到服务器 NSURLRequest urlRequest AFHTTPRequestSerializer serializer multipartFormRequestWithMethod POST URLS