将image / jpeg分成块并在nsdictionary中绑定以在iOS中发送JSON

时间:2014-07-05 11:40:33

标签: ios image sockets nsdata outputstream

编辑:我没有很好地解释服务器工作和我的道歉。所以这里有两个服务器工作的东西(期望来自客户端的数据)

1)服务器具有接收图像数据的大小限制。它希望图像以字节数组的形式分解 2)服务器期望通过JSON接收这些字节数组块。

所以我假设这在客户端转换为以下内容

1)我需要打破部分图像 2)创建每个部分的Byte数组 3)用JSON绑定那些字节数组并用服务器

发送

服务器收到后,服务器将其构建为Image。

我试图通过以下方法实现上述目标(我将图像文件保存在NSData中,然后我创建一个字节缓冲区并在该缓冲区中保留图像文件的NSData块。发布我用JSON绑定此缓冲区

以下是上述方法的代码:

- (void)dividepacketId:(int)pktId fileData:(NSData *)dt // dt包含图像文件的NSData {

Byte buffer[20480];
long long dtLength,from=0;
long long len=[dt length];
BOOL b=YES;
while (b)
{
    int k=0,indexCont=0;
    if(len>20480)
    {
      dtLength=20480;
    }
    else
    {
        dtLength=len;
        b=NO;
    }
    [dt getBytes:buffer range:NSMakeRange(from,dtLength)];

    NSData *imageData=nil;
    imageData = [NSData dataWithBytes:buffer length:dtLength];
    len=len-dtLength;
    from=from+dtLength;
    NSLog(@"sending buffer=%s legth of buffer=%lli len value=%lli",buffer,dtLength,len);   //everything is fine till here
    NSMutableDictionary *projectDictionary3 = [NSMutableDictionary dictionaryWithCapacity:1];
    [projectDictionary3 setObject:@"2100" forKey:@"Action"];
    [projectDictionary3 setObject:[NSString stringWithFormat:@"%i",pktId] forKey:@"PacketId"];
    [projectDictionary3 setObject:@"101" forKey:@"FileAction"];
    if(imageData!=nil)
    [projectDictionary3 setObject: imageData forKey:@"FData"];//data
    [projectDictionary3 setObject:[NSString stringWithFormat:@"%i",(int)dtLength] forKey:@"DataLength"];//data
    NSError *jsonSerializationError = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:projectDictionary3 options:NSJSONWritingPrettyPrinted error:&jsonSerializationError]; //"here crashed"
    if(!jsonSerializationError)
    {
        NSString *serJSON = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        NSLog(@"Serialized JSON: %@", serJSON);
    }
    else
    {
     NSLog(@"JSON Encoding Failed: %@", [jsonSerializationError localizedDescription]);
    }
code to send over stream
[self sendDataToServer:jsonData];

} // while while循环

}

这是挑战。如果我通过此代码发送简单数据(例如字符串),它将成功转发到服务器(通过套接字)。但是当我尝试将一个实际的jpeg图像分解成部分并将其绑定到nsdictionary中以生成json时,它会因以下错误而崩溃。

由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' JSON写入中的无效类型(NSConcreteData)'。任何帮助都将受到高度赞赏。

编辑:正如bobnoble所解释的,我理解异常的原因。但是,在这种情况下,如何完成将数据发送到服务器

2 个答案:

答案 0 :(得分:0)

来自NSJSONSerialization class reference

  

可以转换为JSON的对象必须具有以下内容   属性:

     
      
  • 顶级对象是NSArray或NSDictionary。
  •   
  • 所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
  •   
  • 所有字典键都是NSString的实例。
  •   
  • 数字不是NaN或无穷大。
  •   

第二个项目符号不包括NSData,这就是抛出异常的原因。

将图像数据转换为Base64编码,然后将其作为NSString放入字典中。请查看NSData base64EncodedStringWithOptions方法。

答案 1 :(得分:0)

删除除了需要更改的关键部分以外的所有部分 正如我在评论中所说,数据需要采用JSON句柄格式,原始字节是不可接受的,因此一种方法是使用Base64对数据进行编码。接收器还需要将Base64字符串解码为数据。

while (b) {
    //get chunk from and dtLength

    NSData *imageData = [dt subdataWithRange:NSMakeRange(from, dtLength)];
    NSData *imageBase64Data = [imageData base64EncodedDataWithOptions:0];
    NSString *imageBase64String = [[NSString alloc] initWithData:imageBase64Data encoding: NSUTF8StringEncoding];

    // update len and from

    NSLog(@"sending imageData =%@. dtLength =%i len =%lli", imageBase64String, dtLength, len);   

    // Create projectDictionary3 and add items

    // Added image data)
    if(imageData.length) {
        [projectDictionary3 setObject: imageBase64String forKey:@"FData"];
    }
    [projectDictionary3 setObject:@(imageBase64String.length) forKey:@"DataLength"];

    // serialize projectDictionary3 into JSON and sent to server];
}