3

従来、アプリがインターネットとやり取りするには、Webサービスを使用して情報を交換する必要があることを私は知っています。しかし、どのようにしてデータ(写真、テキスト、オーディオ録音など)をアプリからサーバー(すべてのユーザーアカウントのデータを保持する)にアップロードするのでしょうか?調査からサーバーへの電子メールの戦術を使用している人がいることは知っていますが、それでも効果がなく、遅いように聞こえます。Instagramなどのアプリはどのように速くアップロードされますか?私はその種のアップロードを複製しようとしています。私を正しい方向に導いてください。

助けてくれてありがとう!

4

5 に答える 5

4

あなたは間違いなくAFNetworkingを調べる必要があります。これは、phpWebサービスに画像をアップロードする例です。

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 に答える
4

ご存知かもしれませんが、アップロード速度は常に使用している接続タイプの速度に制限されます。接続が遅い場合、最良のアップロード手法でさえ遅くなります(たとえば、GPRS、またはEDGE、ネットワークカバレッジが良くない場合は3Gでさえ遅くなる可能性があります)。

大量のデータをより速く/より良くアップロードするには、ZIPまたはその他の必要なファイル圧縮形式を使用して送信するデータを圧縮するか、独自の圧縮アルゴリズムを開発することもできます(これは望まない場合があります;-) )。

たとえば、HTTP / HTTPS接続のオーバーヘッドを削減したい場合は、データ交換用の独自のプロトコルを作成し、それをクライアント/サーバー側に実装して、より高速にアップロードできます。セキュリティなどを追加する必要があるため、プロトコル自体だけでなく、すべての実装作業を行う必要があるため、これは多くの作業になります。ただし、最初に述べたように、プロトコルを作成することを選択した場合でも、処理は遅くなります。接続が遅い場合。

更新:マイク・クリーガー(Instagramの共同創設者)によるプレゼンテーションで、あなたの質問が私の道を越えましたhttps://speakerdeck.com/u/mikeyk/p/secrets-to-lightning-fast-mobile-design?slide =1

非常に高速だと思う理由は、リクエスト(この場合はアップロード)が完了する前にUIを更新しているためです。これは、マイクが「楽観的であること」と表現していることです。リクエストが失敗した場合でもユーザーに通知できますが、それまでの間、ユーザーは生産性を感じ、リクエストが正常に完了したように振る舞います。

于 2012-06-25T15:26:24.263 に答える
2

これはかなり自由形式の質問ですが、次の点に注意してください。

「高速アップロード」は、ユーザーの接続とサーバーの帯域幅に依存するため、ここでは説明しません。

NSDataオブジェクトを作成し、それらをPOSTリクエストに添付することで、写真(およびその他のファイル)をアップロードできます。NSDataをアップロードするためのサンプルコードはすでにたくさんありますが、UIImageを変換するには、次のようにします。

NSData *imageData = UIImagePNGRepresentation(image);

これは、組み込みのCocoaクラス(NSMutableURLRequest)とサードパーティのネットワーククラス(AFNetworkingなど-ファイルのアップロードまでスクロールダウンするだけ)を使用して行うことができます。

于 2012-06-25T15:17:20.800 に答える
1

単純なデータをWebサーバーに送信するときは、次のアプローチを使用します。サーバーへの接続にASIHttpRequestフレームワークを使用します。データをHTTPPost本文で送信します。これは、ASIHttpRequestフレームワークで簡単に実行できます。データを送信する前に、データをXMLまたはJSON(これにはSBJsonフレームワークを使用)に変換する必要があります。次に、jsonまたはxmlを解析するphpスクリプトを作成し、カスタムSQLスクリプトを使用してこのデータをデータベースに入力します。これらの手順のいずれかで必要な場合は、コードスニペットを提供できます...

于 2012-06-25T15:16:55.723 に答える
0

あなたの最初の文で、あなたは基本的にあなた自身の質問に答えたように私には思えます。

ファイルを受信するにはサーバー上に何かが必要です。次に、それに合わせてクライアントコードを記述します。必要なセキュリティと制御に応じて、ftpのように単純な場合もあれば、カスタムプロトコルのように複雑な場合もあります。

于 2012-06-25T15:14:12.930 に答える