3

画像をバイト配列で送信する必要がある投稿 Web サービスがあり、JSON 形式で投稿パラメーターを送信する必要があるため、そのNSDictionary. 私の問題は、 の辞書のキーにオブジェクトを割り当てる方法です。Byteそうしようとしましたが、作成中にアプリケーションがクラッシュしましNSDictionaryた。また、以下のyの質問を簡単に理解できるように、コードを使用して各手順を説明しています:-

画像をバイト形式に変換するための私のコードは次のとおりです:-

NSData *data = [NSData dataWithContentsOfFile:filePath];
NSUInteger len = [data bytes];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);

これで、Byteバイト配列にイメージが含まれているので、このオブジェクトを に割り当てたいと思いますNSDictionary。ここにコードがあります、

NSDictionary *dictJson = [NSDictionary dictionaryWithObjectsAndKeys:
byteData, @"photo",
nil];

dictJsonオブジェクトを作成している上記の行でアプリケーションがクラッシュします。Byte を に渡す方法はありますNSDictionaryか?

また、別の質問ですが、どうすればよいNSLog byteDataですか?

私を助けてください。

前もって感謝します!

4

5 に答える 5

6

バイトを数値として含む JSON 配列として画像データを本当に送信したい場合は、配列を「手動で」作成する必要があります。組み込み関数はありません。

NSData *data = ... // your image data
const unsigned char *bytes = [data bytes]; // no need to copy the data
NSUInteger length = [data length];
NSMutableArray *byteArray = [NSMutableArray array];
for (NSUInteger i = 0; i < length; i++) {
    [byteArray addObject:[NSNumber numberWithUnsignedChar:bytes[i]]];
}
NSDictionary *dictJson = [NSDictionary dictionaryWithObjectsAndKeys:
              byteArray, @"photo",
              nil];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictJson options:0 error:NULL];

JSON データは次のようになります。

{"photo":[byte0, byte1, byte2, ...]}

したがって、おそらくそれがサーバーの期待です。ただし、これは (たとえば Base64 と比較して) 画像データを送信する方法として (スペースの点で) 非常に非効率的であることに注意してください。

于 2013-04-09T09:15:50.277 に答える
0

mustに配置するオブジェクトNSDictionary自体は から派生したものだと思いますNSObject

Byte *から派生していないことは明らかですNSObject

のようなコレクション クラスを使用してみるか、直接そこにNSArray入れてみてください。NSData

于 2013-04-09T08:09:28.040 に答える
0

バイトを NSValue に入れてみることができます:

    UIImage* testImage = [UIImage imageNamed:@"Default.png"];
    NSData* data = UIImagePNGRepresentation(testImage);
    NSValue* value = [NSValue valueWithBytes:[data bytes] objCType:@encode(UIImage)];

    NSDictionary *dictJson = [NSDictionary dictionaryWithObjectsAndKeys:
                              value, @"photo",
                              nil];
于 2013-04-09T08:11:04.163 に答える
0

ファイル オブジェクトを含むリクエスト ディクショナリを作成します。後で postWith: 関数がイメージ バインディング タスクを操作します。

NSDictionary *requestDict = [NSDictionary dictionaryWithObjectsAndKeys:@"FirstObjectValue",@"FirstKey",
                             @"Second Object",@"Second Key",
                             @"myFileParameterToReadOnServerSide",@"file", nil]; // This line indicate ,POST data has file to attach
[self postWith:requestDict];

次の関数は、POST するオブジェクトのディクショナリからすべてのパラメータを読み取り、画像を送信する場合にディクショナリに「ファイル」キーを追加します。これにより、リクエストで送信するファイルがあることを識別します

- (void)postWith:(NSDictionary *)post_vars
{
    NSString *urlString = [NSString stringWithFormat:@"YourHostString"];

    NSURL *url = [NSURL URLWithString:urlString];
    NSString *boundary = @"----1010101010";

    //  define content type and add Body Boundry
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

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

    NSEnumerator *enumerator = [post_vars keyEnumerator];
    NSString *key;
    NSString *value;
    NSString *content_disposition;

    while ((key = (NSString *)[enumerator nextObject])) {

        if ([key isEqualToString:@"file"]) {

            value = (NSString *)[post_vars objectForKey:key];
            //  ***     Write Your Image Name Here  ***
            // Covnert image to Data and bind to your post request
            NSData *postData = UIImageJPEGRepresentation([UIImage imageNamed:@"yourImage"], 1.0);

            [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\";\r\nfilename=\"testUploadFile.jpg\"\r\n\r\n",value] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:postData];
        } else {
            value = (NSString *)[post_vars objectForKey:key];

            content_disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key];
            [body appendData:[content_disposition dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];

        }

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

    }

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

    [request setHTTPBody:body];
    [request addValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField: @"Content-Length"];

    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    NSLog(@"%@", returnString);        
}
于 2013-04-09T08:31:03.243 に答える