我正在使用NSURLSesssion上传任务将图像上传到服务器,以字节为单位发送。在wifi中工作正常,但是当我使用MobileData / 4G LTE网络上传时,它显示-1001错误代码。
我尝试过:
仍然,此问题仅存在于4G LTE网络上。
注意:相同的服务API在Android中工作。
请让我知道问题可能是什么?
NSMutableURLRequest * request = [[NSMutableURLRequest alloc] init];
NSString *boundary = @"---------------------------14737809831466499882746641449";
[request setCachePolicy:cachePolicy];
[self prepareMethod:methodURL methodType:methodType dataInBody:dataInBody contentType:contentType withRequest:request];
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];
NSMutableData * bodyData = [[NSMutableData alloc] init];
params = [[[NSUserDefaults standardUserDefaults]objectForKey:@"userparams"]mutableCopy];
for (NSString *param in params)
{
if (![param isEqualToString:@"file"]) {
[bodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"%@\r\n", [params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}
}
// add image data
[bodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpeg\"\r\n", @"file"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[params objectForKey:@"file"]];
[bodyData appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
// sessionConfiguration.timeoutIntervalForRequest = 120.0;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionUploadTask* uploadtask = [session uploadTaskWithRequest:request fromData:bodyData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
if (!error)
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
HttpResponse * response = [[HttpResponse alloc] initWithHttpURLResponse:httpResponse withData:data];
dispatch_async(dispatch_get_main_queue(), ^{
if ([delegate respondsToSelector:@selector(connectionFinishedLoading:)]) {
[delegate connectionFinishedLoading:response];
}
});
}
else
{
dispatch_async(dispatch_get_main_queue(), ^{
if ([delegate respondsToSelector:@selector(connectionFailedWithError:)])
{
[delegate connectionFailedWithError:error];
}
});
}
}];
[uploadtask resume];
答案 0 :(得分:0)
1001超时。这可能意味着您的蜂窝连接异常糟糕,或者您的测试主机无法通过蜂窝网络访问。
也就是说,您还使用前台会话(默认会话)来上传大量数据,并且一旦您的应用程序进入后台或电话掉电以节省电量时,该连接就会建立取消。几乎可以肯定,您应该使用自己创建的后台会话。这样一来,您的上传就不会被取消。
此外,通过蜂窝网络上传大文件通常不是一个好主意,因为HTTP规范不支持在网络故障时恢复上传。如果平均一个文件要花费大约五秒钟以上的时间,则应在服务器端进行更改,以便可以将该文件分块上传,然后重新组装。