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所解释的,我理解异常的原因。但是,在这种情况下,如何完成将数据发送到服务器
答案 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];
}