파일 컬렉션이 있습니다. 목록에서 모든 파일을 하나씩 업로드해야합니다. 일단 파일이 업로드되면 서버는 returnId를 보내 저장합니다. 그에 따라 진행 상황을 보여줄 필요가 있습니다. 하나씩 여러 파일을 업로드 할 때 iOS 문제가 발생합니다.
는 그러므로 나는 다음을 시도 - 인덱스 0 내 파일이 업로드되면 이- (NSURLSession *)uploadSession
{
static NSURLSession *defaultSession = nil;
static dispatch_once_t uploadToken;
dispatch_once(&uploadToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.xyz.abc"];
configuration.HTTPMaximumConnectionsPerHost = 10;
defaultSession = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return defaultSession;
}
-(NSURLSessionUploadTask *)uploadFileWithUrl:(NSString *)fileUrl
{
NSURL *url = [NSURL URLWithString: @"ploadableUrl"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // default
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSString *base64str = [NSString stringWithFormat:@"%@:%@", kAPIAccessUsername, kAPIAccessPassword];
NSData *base64data = [base64str dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Encoded = [base64data base64EncodedStringWithOptions:0];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", base64Encoded];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
NSString *boundary = @"---9999999999";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"]; // over-ridding for multipart/form-data;
/* body of the post */
NSMutableData *reqBodyData = [NSMutableData data];
[reqBodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *str = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"data\"; filename=\"%@\"\r\n", @"fileN"]; // "data" is the parameter required
[reqBodyData appendData:[[NSString stringWithString:str] dataUsingEncoding:NSUTF8StringEncoding]];
[reqBodyData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
NSData *uploadableData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:fileUrl]];
[reqBodyData appendData:uploadableData];
[reqBodyData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:reqBodyData];
NSString *postLength = [NSString stringWithFormat:@"%ld", [reqBodyData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setCachePolicy:NSURLRequestUseProtocolCachePolicy];
NSURLSession *session = [self uploadSession];
NSURLSessionUploadTask *dataTask = [session uploadTaskWithRequest:request fromFile:nil];
DLog(@"upload taskIdentifier ---------------------> %lu", (unsigned long)dataTask.taskIdentifier);
[dataTask resume];
return dataTask;
}
- (void)initiateUpload
{
uploadTask = [self uploadFileWithUrl:[_fileUrlCollections objectAtIndex:self.index]]; // initially index = 0
}
- (void)dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"CompletetaskIdentifier -> %ld", dataTask.taskIdentifier);
if (data)
{
NSError *error;
NSMutableDictionary *jsonDict = [NSMutableDictionary dictionaryWithDictionary:[NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:&error]];
if (!_uploadedIdCollections)
_uploadedIdCollections = [NSMutableArray arrayWithCapacity:0];
[_uploadedIdCollections addObject:[jsonDict valueForKey:@"savedId"]];
self.index++;
if([_fileUrlCollections count] > self.index)
{
NSLog(@"UPLOADING NEXT FILE");
[self initiateUpload];
}
else
{
NSLog(@"UPLOADED ALL FILES");
}
}
}
, 서버가 다음, 나는 인덱스 1로 파일을 업로드하는 것을 시도하고 있음을 저장 한 후, 나에게 적절한 returnId를 보냅니다. 하지만 더 이상 업로드하지 않습니다. 누락되거나 잘못 된 것이 무엇인지 모릅니다.
즉각적인 제안이 필요합니다.
미리 감사드립니다.
감사합니다. Rob, 제안 사항. 확인해야 할 사항이 거의 없으며 4 번과 5 번 항목이 구현되었습니다. 서버가 우리가 작성한 모든 호출에 응답해야합니다 (보안 이유). Content-Type이 overrides되는 ===> NSString * contentType = [NSString stringWithFormat : @ "multipart/form-data; boundary = % @", 경계]; [요청 setValue : contentType forHTTPHeaderField : @ "Content-Type"]; // multipart/form-data에 대한 over-ridding; – Satyaranjan
나는 당신을 따르지 않는다 # 6 : 당신이 여기에 사용하지 않는 일부'req' 객체에 대해 인증을 설정하고있다 ._'req'는 무엇인가? '요청'이라고하셨습니까? – Rob
예. 오타를 유감스럽게 생각한다! – Satyaranjan