0

在 MacOSX 上,使用 Core Foundation,我想通过 REST API 将一个大文件(数百兆字节)上传到远程服务器。由于文件很大,而且我还需要给用户一些反馈,所以我想实现一个简历上传功能,并就写入的字节数给用户反馈。

我首先遵循了 CFNetwork 编程的 Apple 指南:http: //developer.apple.com/library/ios/#documentation/Networking/Conceptual/CFNetwork/CFFTPTasks/CFFTPTasks.html#//apple_ref/doc/uid/TP30001132-CH9 -SW1 但文件的异步上传仅适用于 FTP。

我尝试使用 CFReadStreamCreateForHTTPRequest 但我只收到响应回调。我尝试使用 CFReadStreamCreateForHTTPStreamedRequest 并在 ReadStreamRef 主体参数上设置了一个委托,但即使我在运行循环上实际调度它之前打开流,它也不会被调用。

如果有人对如何做到这一点有一些提示,那就太好了。非常感谢!

——雷米

4

1 回答 1

0

我在这里得到了答案:http: //lists.apple.com/archives/macnetworkprog/2010/Dec/msg00000.html

CFReadStreamCreateForHTTPStreamedRequest 是一个很好用的函数。

对于上传反馈,我在创建请求时使用了在 runloop 上安排的计时器:

CFRunLoopTimerCreate(kCFAllocatorDefault, 0, 10.0, 0, 0, ...);

对于简历,有两个步骤。

在良好的偏移量处寻找本地内容流

创建本地内容流(但尚未打开)后,我可以使用

CFReadStreamSetProperty(content_stream, kCFStreamPropertyFileCurrentOffset, upload_length);

配置http头

我没有 webdav 样式的远程服务器,所以我使用 HTTP Range 标头来通知服务器我要上传文件的哪一部分。此步骤取决于远程服务器的期望。

CFHTTPMessageSetHeaderFieldValue(request_headers, CFSTR("Range"), content_range_value);

希望这会有所帮助。

于 2010-12-10T09:32:17.120 回答