我使用此功能将图像上传到使用JSON
的服务器。为了做到这一点,我首先将图像转换为NSData
,然后使用Base64
转换为NSString
。该方法在图像不是很大时工作正常,但当我尝试上传2 Mb图像时,它崩溃了。
问题是,即使调用了didReceiveResponse
方法以及返回(null)
的didReceiveData
方法,服务器也没有收到我的图像。起初我以为这是超时问题,但即使将其设置为1000.0,它仍然不起作用。任何想法?感谢您的时间!
下面是我当前的代码:
- (void) imageRequest {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.myurltouploadimage.com/services/v1/upload.json"]];
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/design%i.png",docDir, designNum];
NSLog(@"%@",path);
NSData *imageData = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:path]);
[Base64 initialize];
NSString *imageString = [Base64 encode:imageData];
NSArray *keys = [NSArray arrayWithObjects:@"design",nil];
NSArray *objects = [NSArray arrayWithObjects:imageString,nil];
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:kNilOptions error:&error];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d",[jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"Image uploaded");
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
}
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}
字符串
2条答案
按热度按时间2vuwiymt1#
我最终决定上传Base64镜像,将其拆分成更小的子串。为了做到这一点,并且我需要很多
NSURLConnections
,我创建了一个名为TagConnection
的子类,它为每个连接提供了一个标记,这样就不会混淆它们。然后我在
MyViewController
中创建了一个TagConnection
属性,目的是从任何函数访问它。正如你所看到的,有一个-startAsyncLoad:withTag:
函数分配和初始化TagConnection
,还有一个-connection:didReceiveData:
函数,当我收到来自服务器的响应时,它会删除它。参考
-uploadImage
函数,它首先将图像转换为字符串,然后将其拆分并将块放入JSON请求中。它被调用,直到变量偏移量大于字符串长度,这意味着所有块都已上传。您还可以通过每次检查服务器响应并仅在返回成功时调用
-uploadImage
函数来证明每个块都已成功上传。TagConnection.h
字符串
TagConnection.m
型
MyViewController.h**
型
MyViewController.m**
型
sg3maiej2#
请不要认为这是最后的选择,这只是我的观察。
我认为你应该发送块,而不是完整的数据的NSData.我已经看到这样的方法在YouTube视频上传.他们发送大量的NSData(视频文件的NSData)在许多NSData块.
他们使用相同的方法上传大数据。
所以应该谷歌一下YouTube数据浏览API。你应该搜索YouTube浏览器使用的方法。