3

我有一个 post web 服务,我需要以字节数组发送图像,并且因为我需要以 JSON 格式发送 post 参数,所以我创建了它的NSDictionary. 我的问题是如何将对象分配给字典中的键Byte,我尝试这样做并且在创建时应用程序崩溃NSDictionary。我还用代码解释了每个步骤,以便于理解下面的问题:-

这是我将图像转换为字节格式的代码:-

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 回答
1

如果您将此信息作为 JSON 发送到服务器,则需要首先使用Base 64等编码将其转换为有效字符串。

于 2013-04-09T08:16:46.553 回答
0

我相信您放置在NSDictionarymust 中的任何对象本身都来自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];

如果要发送图像,以下函数将从要发布的对象字典中读取所有参数,然后在字典中添加“文件”键,以标识要随请求发送的文件

- (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 回答