0

次のコードを使用してデータ付きの画像を投稿しようとしました。データはアップロードされていますが、画像はアップロードされていません。

-(void)imageUpload
{
    name=@"Har9233";
    userId=@"2969";
    cityId=@"1";
    mobile=@"9888329329";
    mobileVerify=@"no ";
    gender=@"1";

    //NSString *imageData=@"12";

    NSData *imageData = UIImageJPEGRepresentation(imageView.image, 1.0);
    NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];

    [_params setObject:userId forKey:@"userId"];
    [_params setObject:name forKey:@"profileDisplayName"];
    [_params setObject:gender forKey:@"gender"];
    [_params setObject:cityId forKey:@"cityId"];
    [_params setObject:mobile forKey:@"mobile"];
    [_params setObject:mobileVerify forKey:@"isMobileVerified"];

    NSString *boundary = @"ghkyre–nhjfhdj-74f5f-gfg5-gggff";

    NSString* FileParamConstant =@"image";

    //
    NSURL* requestURL = [NSURL URLWithString:@"myurl"];

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

    // set Content-Type in HTTP header
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"];

    // post body
    NSMutableData *body = [NSMutableData data];

    // add params (all params are strings)
    for (NSString *param in _params) {
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
    }

// add image data


if (imageData) 
{
        NSLog(@"2");
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"harryimg1.png\"\r\n",FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
       [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:imageData]];
        [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];       
}

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


// setting the body of the post to the reqeust
[request setHTTPBody:body];

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

// set URL
[request setURL:requestURL];
NSURLResponse *response;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:Nil];

NSDictionary *jsonResponseData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"DATA=%@",jsonResponseData);

}
4

2 に答える 2

-1

私は同じ問題を抱えていて、あなたのようなコードを使用しています。これを試してください、それは確かに機能します、それは私が使用しているものです:

- (NSString *)randomStringWithLength:(int)length
    {

        NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        NSMutableString *randomString = [NSMutableString stringWithCapacity:length];

        for (int i = 0; i < length; i++) {
            [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
        }

        return randomString;
    }

-(BOOL)uploadImageFile:(NSString *)filename
    {
        NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:@"yourUrl"]];

        [request setHTTPMethod:@"PUT"];
        NSString *boundary = [self randomStringWithLength:14];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
        [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
        NSMutableData *postbody = [NSMutableData data];
        NSData *data = [NSData dataWithContentsOfFile:filename];
        [postbody appendData:[NSData dataWithData:data]];
        [request setHTTPBody:postbody];

        NSURLResponse *urlResponse = nil;
        NSError *requestError = nil;
        NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];

        if (((NSHTTPURLResponse *)urlResponse).statusCode != 201) {
            NSLog(@"Unable to upload file: %@, response data: %@, response code: %i, request error: %@", [filename lastPathComponent], [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding], ((NSHTTPURLResponse *)urlResponse).statusCode, requestError);
            return NO;
        }

        NSLog(@"Uploading File Successful");
        return YES;

    }
于 2013-10-07T10:42:58.147 に答える
-3

私のコメントをより正確にレンダリングするには:

コードはほぼ正しいように見えますが、いくつかの問題があります。

まず、「境界区切り文字」の前に CRLF を付ける必要があります。そして、概念的には、この先行する CRLF は「境界区切り文字」に属します。

次に、パラメーターの「Content-Type」ヘッダーは問題ありません。

したがって、次のように変更することをお勧めします

// add params (all params are strings)
for (NSString *param in _params) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

// add params (all params are strings)
for (NSString *param in _params) {
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendBytes:"Content-Type: text/plain; charset=utf-8\r\n" length:41];
    // (other headers if any)
    // close headers with CRLF:
    [body appendBytes:"\r\n" length:2];
    // param value:
    [body appendData:[[NSString stringWithFormat:@"%@", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

たとえば、CRLF をバイナリ データに追加しないでください。バイナリ データを含む部分を出力する場合は、上記の行に従います。ご覧のとおり、パラメーター値を本体部分に書き込んだ後、CRLF を閉じる必要はありません。

したがって:

if (imageData) 
{
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"harryimg1.png\"\r\n",FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];     
}

さらに、「close-boundary-delimiter:

最後の部分の後に、次を追加します。

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

最後の CRLF は必須ではありませんが、害はありません。

編集

その他の注意事項:

NSURLConnection大きなデータを送信する場合、 の便利なクラス メソッド sendSynchronousRequest:を使用することはお勧めしません。何か問題が発生したときにリクエストをキャンセルできるようにし、より多くの制御を提供する NSURLConnection デリゲートを実装することをお勧めします。

さらに、このアプローチNSDataでは、マルチパート/フォーム データ メッセージのリクエスト ボディとして a を使用します。これには、while 本体がメモリに収まる必要があります。これにより、メモリの問題が発生する可能性があります。より堅牢なアプローチでは、入力ストリームをリクエスト本文として利用しますが、この実装ははるかに複雑です (実際にははるかに複雑です)。

iOS 7 には新しい API があり、大きなファイルの送信がより簡単になるはずです。NSURLSessionおよびのドキュメントを参照してくださいNSURLSessionUploadTask

于 2013-10-07T14:05:19.430 に答える