【问题标题】:Uploading From App to Server in IOS在 IOS 中从 App 上传到服务器
【发布时间】:2012-06-26 20:44:05
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 我已经与网络服务器交换了信息,但不幸的是,我什至不知道如何上传,因此问题
  • 我已经用一个链接更新了我的答案,告诉你 Instagram 是如何做到这一点的 ;-)

标签: objective-c ios ios5 upload


【解决方案1】:

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

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】:

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

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

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

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

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

    【讨论】:

    • 哇,我看到了这里发生的错觉!看起来我也应该这样做:P 将查询作为异步调度,只需更新 ui 即可继续前进,非常感谢!
    • 那个演示真的很有趣
    【解决方案3】:

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

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

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

    NSData *imageData = UIImagePNGRepresentation(image);
    

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

    【讨论】:

    • 谢谢你!我会在这个方向上做更多的研究并尝试我的解决方案。
    【解决方案4】:

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

    【讨论】:

    • 如果不是太麻烦,你能帮我一些代码sn-ps吗?我可以使用它!
    • 是的,我在工作,没有带我的 macbook。但是当我几个小时后回到家时,我会发布它。
    • 我会选择 mkral 发布的 AFNetwork。这是另一个很好的框架
    • 是的,我决定尝试一下!
    【解决方案5】:

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

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

    【讨论】:

    • 哈哈,我猜是这样,但电子邮件到服务器的方法似乎真的很慢。 Instagram 等 App 是如何直接上传图片这么快的?他们是否使用已知方法或自定义上传协议等?
    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2015-11-26
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多