我使用alasset库成功获取了我的iphone图库中的所有图片网址并存储在一个数组中。现在我想上传到服务器,这是我的代码:
我尝试了两种方法,但是在迭代了大约10张图像后,两种方法都崩溃了,没有任何崩溃日志。图片无法上传到服务器,在上传前会崩溃。
1
NSData *imgData; UIImage *img; NSInputStream *stream;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://my.url.com"]];
for(int i=0; i<_dataContainer.count; i++)
{
img = [UIImage imageWithCGImage:[[[_dataContainer objectAtIndex:i] defaultRepresentation]fullResolutionImage]];
imgData = UIImageJPEGRepresentation(img, 1.0);
stream = [[NSInputStream alloc] initWithData:imgData];
[request setHTTPBodyStream:stream];
[request setHTTPMethod:@"POST"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]);
}];
}
2:使用Afnetworking
AFHTTPClient *client= [[AFHTTPClient alloc]initWithBaseURL:[NSURL URLWithString:@"http://my.url.com"]];
NSURLRequest *myRequest;
__block UIImage *img;
__block NSData *imgData;
__block NSString *fName;
myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/images/mypage.php" parameters:nil constructingBodyWithBlock:
^(id <AFMultipartFormData>formData)
{
img = [UIImage imageWithCGImage:[[[_dataContainer objectAtIndex:0] defaultRepresentation]fullResolutionImage]];
imgData = UIImageJPEGRepresentation(img, 1.0);
fName = [self returnDateTimeWithMilliSeconds];
[formData appendPartWithFileData:imgData name:@"photo" fileName:[NSString stringWithFormat:@"%@.jpg",fName] mimeType:@"image/jpeg"];
NSLog(@"FN=>%@ | Size=>%@",fName, [NSByteCountFormatter stringFromByteCount:[imgData length] countStyle:NSByteCountFormatterCountStyleFile]);
}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:myRequest];
[operation start];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"Success Data -> %@", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failed");
}];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"Progrees -> %f", ((float)((int)totalBytesWritten) / (float)((int)totalBytesExpectedToWrite)));
}];
答案 0 :(得分:2)
@interface MyHTTPClient : AFHTTPClient
+ (id)sharedClient;
@end
@implementation MyHTTPClient
+ (id)sharedClient
{
static MyHTTPClient *sharedClient;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClient = [[MyHTTPClient alloc] initWithBaseURL:nil];
});
return sharedClient;
}
@end
@implementation MyViewController
- (void)uploadImages
{
NSURLRequest *myRequest;
__block UIImage *img;
__block NSData *imgData;
__block NSString *fName;
myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/images/mypage.php" parameters:nil constructingBodyWithBlock:
^(id <AFMultipartFormData>formData)
{
img = [UIImage imageWithCGImage:[[[_dataContainer objectAtIndex:0] defaultRepresentation]fullResolutionImage]];
imgData = UIImageJPEGRepresentation(img, 1.0);
fName = [self returnDateTimeWithMilliSeconds];
[formData appendPartWithFileData:imgData name:@"photo" fileName:[NSString stringWithFormat:@"%@.jpg",fName] mimeType:@"image/jpeg"];
NSLog(@"FN=>%@ | Size=>%@",fName, [NSByteCountFormatter stringFromByteCount:[imgData length] countStyle:NSByteCountFormatterCountStyleFile]);
}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:myRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"Success Data -> %@", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failed");
}];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"Progrees -> %f", ((float)((int)totalBytesWritten) / (float)((int)totalBytesExpectedToWrite)));
}];
[[MyHTTPClient sharedClient] enqueueHTTPRequestOperation:operation]
}
@end
答案 1 :(得分:0)
设置完成和进度块回调后,您应[operation start];
。
答案 2 :(得分:0)
您的崩溃可能是由于内存过载造成的。首先,在第1部分中,您需要在每次迭代时排空自动释放池,如下所示:
NSData *imgData; UIImage *img; NSInputStream *stream;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://my.url.com"]];
for(int i=0; i<_dataContainer.count; i++)
{
@autoreleasepool {
img = [UIImage imageWithCGImage:[[[_dataContainer objectAtIndex:i] defaultRepresentation]fullResolutionImage]];
imgData = UIImageJPEGRepresentation(img, 1.0);
stream = [[NSInputStream alloc] initWithData:imgData];
[request setHTTPBodyStream:stream];
[request setHTTPMethod:@"POST"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]);
}];
}
}
imageWithCGImage:
和UIImageJPEGRepresentation
等方法返回大型自动释放对象,因此您需要确保尽快释放它们以释放内存。
在第2部分:
关于AFNetworking,调用[operation start]
是没用的。该操作将在超出范围时立即释放,因此不太可能实际完成。您需要保留AFHTTPClient实例(通常以单例形式完成,但属性足够好)并通过调用对其进行排队操作:
[httpClient enqueueHTTPRequestOperation:operation]