我知道,通常应用程序要与互联网交互,它必须使用网络服务来交换信息。但是,如何将数据(照片、文本、录音等)从应用程序上传到服务器(保存所有用户帐户的数据)?我知道有些人使用研究中的电子邮件到服务器策略,但即便如此,它听起来效率低下且速度缓慢。Instagram 等应用程序的上传速度为何如此之快?我正在尝试复制这种上传。请指导我正确的方向。
谢谢您的帮助!
我知道,通常应用程序要与互联网交互,它必须使用网络服务来交换信息。但是,如何将数据(照片、文本、录音等)从应用程序上传到服务器(保存所有用户帐户的数据)?我知道有些人使用研究中的电子邮件到服务器策略,但即便如此,它听起来效率低下且速度缓慢。Instagram 等应用程序的上传速度为何如此之快?我正在尝试复制这种上传。请指导我正确的方向。
谢谢您的帮助!
您可能知道,上传速度始终与您使用的连接类型的速度有关。即使是最好的上传技术,在连接速度很慢时也会很慢(例如 GPRS 或 EDGE,如果网络覆盖不好,即使 3G 也会很慢)。
要更快/更好地上传大量数据,您可以做的一件事是使用 ZIP 或您希望的任何其他文件压缩格式压缩您发送的数据,甚至开发您自己的压缩算法(您可能不想这样做;-) )。
例如,如果您想减少 HTTP/HTTPS 连接的开销,您可以编写自己的数据交换协议,在客户端/服务器端实现它并更快地上传。这将是很多工作,因为您不仅要为协议本身做所有的实现工作,因为您需要添加安全性等。但是即使您选择创建一个协议,如开头所说,它也会很慢如果连接很慢。
更新: Mike Krieger(Instagram 的联合创始人)的一次演讲,他在其中谈到了你的问题,我刚刚遇到了https://speakerdeck.com/u/mikeyk/p/secrets-to-lightning-fast-mobile-design?slide =1。
您认为它如此之快的原因是,他们甚至在请求(在这种情况下为上传)完成之前更新了 UI。这就是迈克所说的“乐观”。如果请求失败,您仍然可以通知用户,但同时让他感到高效并表现得像请求成功完成一样。
您绝对应该研究 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 向用户显示上传时间较长的上传。
这是一个非常开放式的问题,但这里有几点需要注意:
“快速上传”取决于用户的连接和服务器带宽,所以我不会涉及。
您可以通过创建 NSData 对象并将它们附加到 POST 请求来上传照片(和其他文件)。已经有大量用于上传 NSData 的示例代码,但要转换 UIImage,您将执行以下操作:
NSData *imageData = UIImagePNGRepresentation(image);
您可以使用内置的 Cocoa 类 (NSMutableURLRequest) 和 3rd 方网络类(例如AFNetworking - 只需向下滚动到文件上传)来执行此操作。
当我将简单数据发送到我的网络服务器时,我使用以下方法: 使用 ASIHttpRequest 框架连接到您的服务器。在 HTTP Post body 中发送数据,这在 ASIHttpRequest 框架中很容易做到。在发送数据之前,您需要将数据转换为 XML 或 JSON(为此使用 SBJson 框架)。然后我编写解析 json 或 xml 的 php 脚本,然后使用自定义 SQL 脚本将此数据输入到我的数据库中。如果您在任何这些过程中需要它们,我可以给您代码片段......
在我看来,用你的第一句话,你基本上已经回答了你自己的问题。
您需要在服务器上接收文件,然后编写客户端代码来匹配。它可以像 ftp 一样简单,也可以像自定义协议一样复杂,具体取决于您需要的安全性和控制。