リクエストをPOSTする必要があります。リクエストには、「email_id」、「location」、「image_data」の3つのパラメータがあります。'image_data'の値には、UIImageのNSDatajpeg表現が含まれています。リクエストは、multipart/form-dataのコンテンツタイプを使用して送信する必要があります。このリクエストを投稿するためのNSMutableRequestを作成するにはどうすればよいですか?境界をどのように設定すればよいですか?境界はパケット全体に必要ですか、それとも画像部分だけで十分ですか?
3 に答える
もし私があなたなら、ASIHTTPRequestライブラリをチェックします。これはCocoa用のHTTPクライアントライブラリであり、iPhoneアプリから多くのWebインタラクションを行う人々の生活をこれまでになく簡単にします。
これが私です。ASIFormDataRequest(ASIHTTPRequestのコンポーネント)を使用して、iPhoneアプリから画像をアップロードしています。これらの画像に対するクライアントの用語は「マーク」です。これらの画像は、ローカルエリア全体のユーザーが撮影したローカル写真のマップに表示されます。ユーザーは「あなたのマークを付ける」ために招待されます。あなたはその後の陽気さを想像することができます。
Anyhooself.mark
は、アップロードしている画像と詳細のパッケージに関するデータをカプセル化するMarkクラスのインスタンスです。このメソッドの最初の行で使用するデータマネージャーシングルトンがあります。これには現在のCLLocationが含まれているため、この画像の地理コード情報を取得できます。
エンコーディングタイプやマルチパート境界については気にしないことに注意してください。ライブラリはそれをすべて処理します。
-(void)completeUpload
{
CLLocation *currentLoc = [DataManager sharedDataManager].currentLocation;
self.mark.latitude = [NSNumber numberWithDouble:currentLoc.coordinate.latitude];
self.mark.longitude = [NSNumber numberWithDouble:currentLoc.coordinate.longitude];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:
[NSURL URLWithString:[NSString stringWithFormat:@"%@image_upload.php", WEBAPPURL]]];
[request setPostValue:self.mark.titleText forKey:@"title"];
[request setPostValue:self.mark.descriptionText forKey:@"description"];
[request setPostValue:self.mark.event.guid forKey:@"event"];
[request setPostValue:self.mark.latitude forKey:@"latitude"];
[request setPostValue:self.mark.longitude forKey:@"longitude"];
[request setPostValue:self.mark.project forKey:@"project"];
[request setPostValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"userID"] forKey:@"user_id"];
request.timeOutSeconds = 120;
int i = 1;
for (NSString *tag in self.tags) {
[request setPostValue:tag forKey:[NSString stringWithFormat:@"tag-%d", i]];
i++;
}
NSData *imageData = UIImagePNGRepresentation(self.mark.image);
NSData *thumbData = UIImagePNGRepresentation(self.mark.thumbnail);
[request setData:imageData forKey:@"file"];
[request setData:thumbData forKey:@"thumb"];
self.progress.progress = 20.0;
[request setUploadProgressDelegate:self.progress];
request.showAccurateProgress = YES;
request.delegate = self;
[request startAsynchronous];
}
編集:ちなみに、私が投稿しているPHPスクリプトはHTTP認証の背後にあります。ASIはこれらのクレデンシャルをキャッシュしますが、以前に提供したので、ここで再度提供する必要はありません。そうしないと、この投稿と対応するPHPスクリプトの記述方法によって、だれでも他の人のユーザーID値を偽造して、自分のユーザー名で投稿する可能性があることに注意してください。このようなアプリを作成するときは、Webサイトの場合と同じように、Webアプリケーションのセキュリティについて考える必要があります。これは、実際には、従来とは異なるクライアントを介して閲覧されたWebサイトです。
このリンク:
http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/
必要なものがすべて含まれている必要があります。画像以外のパラメータを処理するには PHP スクリプトを拡張する必要がありますが、これは私が使用したものです。:)
編集:前のリンクが壊れていることに気づきました。新しいものは動作します
NSData *imageData=UIImageJPEGRepresentation(imageview.image, 1.0); NSString *filename=@"nike.jpg" NSString *urlString = @"http://xyz.com/file_upload/file1.php"; NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = [NSString stringWithString:@"-----------------99882746641449"]; NSString *contentType = [NSString stringWithFormat:@"マルチパート/フォーム データ; 境界=%@",境界]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body = [NSMutableData データ]; NSMutableString * string = [[NSMutableString alloc] init]; [string appendFormat:@"\r\n\r\n--%@\r\n", 境界]; [string appendFormat:@"Content-Disposition: form-data; name=\"emailid\"\r\n\r\n"]; [string appendFormat:@"pradz39@gmail.com"]; //価値 [body appendData:[string dataUsingEncoding:NSUTF8StringEncoding]]; // 本文全体を暗号化する [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename]] dataUsingEncoding: NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [文字列リリース]; [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returnedResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];