2014-09-04 24 views
4

我想上传图像使用分享扩展但问题是当我添加后台任务它给我这个错误,这是说nsdata不支持在后台任务但wwdc会话正在nsdata中上传图像。请你让我知道问题在哪里。我怎样才能从NSData的修复从NSData上传任务不支持在后台会话

上传任务不会在后台会话支持

NSString *boundary = @"SportuondoFormBoundary"; 

NSString * configurationName = @"com.xxxxxxxx.PhotoSharing.backgroundConfiguration"; 

NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationName]; 
[configuration setSharedContainerIdentifier:kGroupNameToShareData]; 


configuration.HTTPAdditionalHeaders = @{ 
             @"api-key"  : @"55e76dc4bbae25b066cb", 
             @"Accept"  : @"application/json", 
             @"Content-Type" : [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] 
             }; 

NSURLSession *session=[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 


NSMutableData *body = [NSMutableData data]; 


for (NSString *key in parameters) 
{ 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [parameters objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]]; 

} 

NSData *imageData = UIImageJPEGRepresentation(image, 0.8); 
NSLog(@"imageDATE, %@", imageData); 
if (imageData) 
{ 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", @"file"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:imageData]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
} 
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 




// Data uploading task. We could use NSURLSessionUploadTask instead of NSURLSessionDataTask if we needed to support uploads in the background 
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kURLBase,kURLAddPostDL]]; 
NSLog(@"url %@",url); 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10000]; 
request.HTTPMethod = @"POST"; 
request.HTTPBody = body; 



NSURLSessionUploadTask *upload=[session uploadTaskWithRequest:request fromData:request.HTTPBody]; 
[upload resume]; 

回答

6

看来最多NSURLSessionUploadTask不支持大尺寸的NSData, 但你可以给一个文件路径NSURLSessionUploadTask在服务器上进行上传,或者在磁盘上临时写入映像,然后给出路径。

下面是一个例子,它正在上传filepath和NSdata。

Uploads using backgroundSessionConfiguration and NSURLSessionUploadTask cause app to crash

更新时间:

//Create a file to upload 
UIImage *image = [UIImage imageNamed:@"[email protected]"]; 
NSData *imageData = UIImagePNGRepresentation(image); 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSArray *URLs = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; 
NSString *documentsDirectory = [[URLs objectAtIndex:0] absoluteString]; 

//这里的文件路径 URL

NSString *filePath = [documentsDirectory stringByAppendingString:@"testfile.png"]; 
[imageData writeToFile:filePath atomically:YES]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://file.upload/destination"]]; 
[request setHTTPMethod:@"PUT"]; 

//这是用它文件路径

NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:[NSURL URLWithString:filePath] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    //code 
}]; 
+0

我该如何给url,我检查链接,但它没有使用url – 2014-09-04 11:14:00

+0

@Developer我已经更新了答案,请检查。 – 2014-09-04 11:44:39

+0

你是否运行这段代码进行共享扩展,这是行不通的 – 2014-09-04 12:53:10