我知道传统上应用程序与互联网交互,它必须使用Web服务来交换信息。但是,如何将数据(照片,文本,录音等等)从app上传到服务器(包含所有用户帐户的数据)?我知道有些人使用研究中的电子邮件到服务器策略,但即使这样,它听起来也是无效且缓慢的。 Instagram上的应用如何快速上传?我试图复制那种上传。请指导我正确的方向。
感谢您的帮助!
答案 0 :(得分: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甚至完成。这就是迈克所说的“乐观”。如果请求失败,您仍然可以通知用户,但同时让他感觉很有效率并且表达成功完成请求。
答案 1 :(得分: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向用户显示上传时间较长的内容。
答案 2 :(得分:2)
这是一个非常开放的问题,但这里有几点需要注意:
“快速上传”取决于用户的连接和服务器带宽,因此我不会深入研究。
您可以通过创建NSData对象并将其附加到POST请求来上传照片(和其他文件)。已有大量用于上传NSData的示例代码,但要转换UIImage,您将执行以下操作:
NSData *imageData = UIImagePNGRepresentation(image);
您可以使用内置的Cocoa类(NSMutableURLRequest)和第三方网络类(例如AFNetworking - 只需向下滚动到文件上传)。
答案 3 :(得分:1)
当我将简单数据发送到我的网络服务器时,我使用以下方法:使用ASIHttpRequest框架连接到您的服务器。在HTTP Post体中发送数据,这在ASIHttpRequest框架中很容易实现。在发送之前,您需要将数据转换为XML或JSON(使用SBJson框架)。然后我编写解析json或xml的php脚本,然后使用自定义SQL脚本将此数据输入到我的数据库中。如果你需要任何这些程序,我可以给你代码片段......
答案 4 :(得分:0)
在我看来,用你的第一句话,你基本上已经回答了你自己的问题。
您需要在服务器上接收文件,然后编写要匹配的客户端代码。它可以像ftp一样简单,也可以像自定义协议一样复杂,具体取决于您需要的安全性和控制。