3

次のような HTTP POST を構築する画像を送信しています。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setHTTPMethod:@"POST"];


NSString *boundary = @"801f6dd4cd17";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;boundary=------------------------------%@", boundary];


NSMutableDictionary *headerFieldsDict = [[ NSMutableDictionary alloc] init];
[ headerFieldsDict setObject:contentType forKey:@"Content-Type"];

[request setAllHTTPHeaderFields:headerFieldsDict];

NSMutableData *body = [NSMutableData data];

//---------- FIRST IMG
UIImage* imgLittle = [realImgButton imageForState:UIControlStateNormal];//thumImg.image;
NSData *imageData = UIImageJPEGRepresentation(imgLittle, 1.0);
if (imageData) {
    [body appendData:[[NSString stringWithFormat:@"------------------------------%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];


    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"img.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];


    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:imageData];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}
[body appendData:[[NSString stringWithFormat:@"------------------------------%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:body];

しかし、サーバーは画像のアップロードを拒否します (ソフトウェア エラーが発生します。HTTP 投稿が十分に解析されていないようです)。サーバーについて私が持っている唯一の情報は、php のこのクライアント コードがうまく機能することです。

$data['file'] = "@".$file;
$header[] = "Expect: ";
print_r($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );

//curl_setopt($ch, CURLOPT_URL, 'http://xxxxxx:yyy/');
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($response);
$url = strip_tags($xml->dict->string[3]->asXML());
return $url;

何か案は?またはobj-cコードのどこが間違っていますか? 生成された HTTP post ステートメントを分析しようとしましたが、php コードによって生成されたものと同じようです。

4

4 に答える 4

0

-addValue:forHTTPHeaderField:これを行う代わりに、次の方法を使用することをお勧めします。

NSMutableDictionary *headerFieldsDict = [[ NSMutableDictionary alloc] init];
[ headerFieldsDict setObject:contentType forKey:@"Content-Type"];

[request setAllHTTPHeaderFields:headerFieldsDict];

実際に行う必要があるのは、単一のヘッダーをリクエストに追加することだけですが、上記のコードを使用して既存のヘッダーを効果的に消去しています。

于 2012-10-10T22:24:51.313 に答える
0

あなたのコードの問題が何であるかははっきりしていませんが、2 つの考えがあります。

  1. 次のよう\r\nに、の最後に別のものが必要になると思います。Content-Disposition

    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"img.jpg\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
  2. コンテンツ タイプの使用UIImageJPEGRepresentationと設定application/octet-streamが問題になる可能性があります。[NSData dataWithContentsOfFile:]に適している可能性があり、 に適しているapplication/octet-stream可能image/jpeg性がありますUIImageJPEGRepresentation。これは単なる推測ですが。

本当に困惑している場合は、AFNetworking を使用できます(これは ASIHTTPRequest よりも最新で軽量です)。または、少なくともコードをチェックアウトして、ファイルのアップロードをどのように処理するかを確認できます.

于 2012-10-17T15:51:40.777 に答える
0

ASIHTTPRequestフレームワークを使用できます。私はこれを使用してサーバーに画像をアップロードするプロジェクトの 1 つです。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:yourURL];
[request addPostValue:NSString  forKey:@"KEY"];
[request addPostValue:NSString forKey:@"KEY"];
... any post value you need

[request addData:image withFileName:[name of the file]
    andContentType:@"image/jpeg" forKey:@"KEY"];

この助けを願っています:)

于 2012-10-15T19:09:29.070 に答える
0

あなたが投稿したコードはおなじみのように見えたので、画像を投稿していた古いアプリをチェックしましたが、明らかに同じソースからコードを入手しました (思い出せません)。私のものはほとんど同じですが、境界文字列を除いて、冗長を取り除いたという事実[NSString stringWithFormat:]

[request setHTTPMethod:@"POST"];

NSString *boundary = @"0xKhTmLbOuNdArY"; 

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"image.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:myImageData];
[body appendData:[[NSString stringWithFormat:@"r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:body];

このコードは私にとってはうまく機能するので、画像データに問題がないと仮定すると、境界が見える場所になる可能性があります。私の画像データもUIImageJPEGRepresentation

于 2012-10-18T18:31:14.200 に答える