NSURLSession 을 이용한 파일업로드에 대해 알아보자.
파일 업로드라는게 은근 짜증난다. 값 하나만 안맞아도 업로드가 되지 않는다...
다음 코드를 살펴보자.
//self.imageUploadUrl 업로드를 할 url
NSString *POST_BODY_BOURDARY = [[NSUUID UUID] UUIDString];
NSString *uploadUrl = [self.imageUploadUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
//upload single image
NSURL *url = [NSURL URLWithString:uploadUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
// set Content-Type
NSString *contentTypeValue = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", POST_BODY_BOURDARY];
[request setValue:contentTypeValue forHTTPHeaderField:@"Content-type"];
// image jpg 압축
NSData *imageData = UIImageJPEGRepresentation(image, 0.9);
// post body > form-data 의 name 이 중요하다.
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POST_BODY_BOURDARY] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileUpload\"; filename=\"%@.jpg\"\r\n", @"ios_upload"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POST_BODY_BOURDARY] dataUsingEncoding:NSUTF8StringEncoding]];
//url session 을 생성하고,
//NSURLSessionUploadTask 를 생성해서 파일을 업로드 하자.
//body 데이터를 formData 에 넣어준다.
NSURLSession *urlSession = [NSURLSession sharedSession];
NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if(error) {
NSLog(@"upload Error %@", [error description]);
}else {
if(data) {
NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//String 값
//Dictionary 형태가 필요하면 NSJSONSerialization 를 사용하자.
NSLog(@"-------%@", response);
//response 값을 가지고 수행할 것이 있다면 여기서 하면 된다.
}
}
}];
[uploadTask resume]; //resume 으로 실행시켜준다.
휴... 파일업로드 기능은 항상 파라미터 문제로 삽질을 하곤 한다.
'아이폰' 카테고리의 다른 글
WKWebView 에서 post url load (1) | 2019.05.17 |
---|---|
WKWebView 에서 내부 리소스 파일 로드하기 (0) | 2019.05.13 |
UIDocumentInteractionController (0) | 2019.05.13 |
맥북 호스트 변경 (0) | 2019.01.08 |
Signing Certificate 인증서 문제로 빌드가 안되는 경우! (0) | 2018.12.12 |