【问题标题】:iOS - Streaming large files for upload (application crashes when allocating too large files using NSData)iOS - 流式上传大文件(使用 NSData 分配过大文件时应用程序崩溃)
【发布时间】:2012-04-10 11:41:57
【问题描述】:

简介

我目前正在对一个Vimeo风格的应用程序进行一些错误修复,即用户可以从手机或iPad录制视频,然后将视频上传给其他用户观看。由于我们现在处理上传的方式,当前的问题与上传大文件有关。

问题

所以问题本质上是当上传文件到服务器时,我们首先将所有必须上传的字节分配在一个 NSData 对象中。然后,此字节字符串将附加到标准 HTTP Post 消息,然后接收 API 将处理它。 问题在于,对于大文件(视频很快),应用程序将简单地崩溃,因为 NSData 对象在 iDevice 上占用了太多内存。

这个过程是这样运作的:

    Byte *buffer = malloc(content.defaultRepresentation.size);

    NSUInteger buffered = [content.defaultRepresentation getBytes:buffer fromOffset:0.0 length:content.defaultRepresentation.size error:nil];

    NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered];

    NSData *movieData = [NSData dataWithData:data];

我只是从保存在 iPhone 或 iPad 的标准相机胶卷中的视频中获取字节。然后我将这些字节放入一个 NSData 对象中。然后,来自这个 NSData 对象的字节串将被简单地附加到一个简单的 HTTP post 消息并发送到 API。

问题

然后的问题是,我看到的问题是,整个字节字符串必须在单个 HTTP Post 消息中发送。那么有什么方法可以加载电影文件的块并将其附加到帖子消息中,这样您一次就不会占用太多内存?或者你怎么能这样做?

感谢您的宝贵时间:)

【问题讨论】:

    标签: objective-c ios xcode file-upload nsdate


    【解决方案1】:

    我建议你使用 ASIHTTPRequest 库。它可以直接从手机上传文件,而不是先将文件加载到内存中。这里的逻辑是将电影文件分成几部分来上传,称为多部分,然后以队列的方式上传

    【讨论】:

    • 啊,是的,我在网站上四处查看并安装并编译了它:) 现在我唯一的问题是 ASIHTTPRequest 库接受文件的字符串 URL(当你想将它附加到POST 请求),但是当它通过 ALAsset 类时,我还没有成功地通过其 URL 成功指向数据(因为该文件位于相机胶卷中的应用程序之外)。甚至可以访问应用程序沙箱之外的文件路径吗?有没有办法解决这个问题?例如,作为一个简单的例子
    • 这会产生一个长度为 0 字节的 NS 数据对象: NSData *testData = [NSData dataWithContentsOfURL:theContent.defaultRepresentation.url];
    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多