3

我知道,通常应用程序要与互联网交互,它必须使用网络服务来交换信息。但是,如何将数据(照片、文本、录音等)从应用程序上传到服务器(保存所有用户帐户的数据)?我知道有些人使用研究中的电子邮件到服务器策略,但即便如此,它听起来效率低下且速度缓慢。Instagram 等应用程序的上传速度为何如此之快?我正在尝试复制这种上传。请指导我正确的方向。

谢谢您的帮助!

4

5 回答 5

4

您可能知道,上传速度始终与您使用的连接类型的速度有关。即使是最好的上传技术,在连接速度很慢时也会很慢(例如 GPRS 或 EDGE,如果网络覆盖不好,即使 3G 也会很慢)。

要更快/更好地上传大量数据,您可以做的一件事是使用 ZIP 或您希望的任何其他文件压缩格式压缩您发送的数据,甚至开发您自己的压缩算法(您可能不想这样做;-) )。

例如,如果您想减少 HTTP/HTTPS 连接的开销,您可以编写自己的数据交换协议,在客户端/服务器端实现它并更快地上传。这将是很多工作,因为您不仅要为协议本身做所有的实现工作,因为您需要添加安全性等。但是即使您选择创建一个协议,如开头所说,它也会很慢如果连接很慢。

更新: Mike Krieger(Instagram 的联合创始人)的一次演讲,他在其中谈到了你的问题,我刚刚遇到了https://speakerdeck.com/u/mikeyk/p/secrets-to-lightning-fast-mobile-design?slide =1

您认为它如此之快的原因是,他们甚至在请求(在这种情况下为上传)完成之前更新了 UI。这就是迈克所说的“乐观”。如果请求失败,您仍然可以通知用户,但同时让他感到高效并表现得像请求成功完成一样。

于 2012-06-25T15:26:24.263 回答
4

您绝对应该研究 AFNetworking。这是我将图像上传到 php Web 服务的示例:

NSData *imageData = UIImagePNGRepresentation(pageImage);

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.SERVER.com"]];


//You can add POST parameteres here
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        author, @"author",
                        title, @"title",
                        nil];

NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"/PATH/TO/WEBSERVICE.php" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {

//This is the image
    [formData appendPartWithFileData: imageData name:@"cover_image" fileName:@"temp.png" mimeType:@"image/png"];


}];



AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

//Setup Upload block to return progress of file upload
[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    float progress = totalBytesWritten / (float)totalBytesExpectedToWrite;
    NSLog(@"Upload Percentage: %f %%", progress*100);
}];




//Setup Completeion block to return successful or failure
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *response = [operation responseString];
    NSLog(@"response: [%@]",response);
    //Code to run after webservice returns success response code

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"error: %@", [operation error]);
    //Code to Run if Failed

}];

[operation start];

编辑-我还使用 MBProgressHUD 向用户显示上传时间较长的上传。

于 2012-06-25T15:36:51.853 回答
2

这是一个非常开放式的问题,但这里有几点需要注意:

“快速上传”取决于用户的连接和服务器带宽,所以我不会涉及。

您可以通过创建 NSData 对象并将它们附加到 POST 请求来上传照片(和其他文件)。已经有大量用于上传 NSData 的示例代码,但要转换 UIImage,您将执行以下操作:

NSData *imageData = UIImagePNGRepresentation(image);

您可以使用内置的 Cocoa 类 (NSMutableURLRequest) 和 3rd 方网络类(例如AFNetworking - 只需向下滚动到文件上传)来执行此操作。

于 2012-06-25T15:17:20.800 回答
1

当我将简单数据发送到我的网络服务器时,我使用以下方法: 使用 ASIHttpRequest 框架连接到您的服务器。在 HTTP Post body 中发送数据,这在 ASIHttpRequest 框架中很容易做到。在发送数据之前,您需要将数据转换为 XML 或 JSON(为此使用 SBJson 框架)。然后我编写解析 json 或 xml 的 php 脚本,然后使用自定义 SQL 脚本将此数据输入到我的数据库中。如果您在任何这些过程中需要它们,我可以给您代码片段......

于 2012-06-25T15:16:55.723 回答
0

在我看来,用你的第一句话,你基本上已经回答了你自己的问题。

您需要在服务器上接收文件,然后编写客户端代码来匹配。它可以像 ftp 一样简单,也可以像自定义协议一样复杂,具体取决于您需要的安全性和控制。

于 2012-06-25T15:14:12.930 回答