[iOS] AFNetworking Get filename (HTTP Head Content-Disposition filename)



기존 업무에 사용되는 (위의 이미지) 화면중에 webview안에 링크를 통한 첨부파일 다운로드 시스템이 존재하였는데, 원래 규약정보대로면,  http://도메인?name=123.jpg .... 등등 paramater 정보에 첨부파일의 이름정보를 가지고, 첨부파일을 저장 및 전달하는 기능을 구현해 놓았다.

어느순간 규약이 틀어짐으로 인하여 정보가 안오는 경우가 발생하여, 예외처리겸 해당 값이 없을때, filename을 구하고자 작업한 내용이다.

해당 URL 값을 HTTP Head로 통신하여, response 값을 구한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<NSHTTPURLResponse: 0x600000dec5c0> { URL: http://----비밀----//
    Connection =     (
        "keep-alive"
    );
    "Content-Disposition" =     (
        "attachment; filename=\"123.jpg\""
    );
    "Content-Length" =     (
        62218
    );
    "Content-Type" =     (
        "application/octet-stream"
    );
    Date =     (
        "Mon, 15 Oct 2018 04:57:49 GMT"
    );
    Server =     (
        nginx
    );
} }
cs

response > Content-Dispostion > filename 값을 사용한다.
NSHTTPURLResponse.allHeaderFields 를 통해 해당 값에 접근이 가능한데, "Content-Dispostion" Key-Value 값을 통해 접근해보면, "attachment; filename=\"123.jpg"\"가 String 값으로 박혀있다.

사실 저값도 substring을 통해서 분할 할 수 있지만, 필자가 http Head정보를 정확하게 전부다 알고 있지 않기 때문에 만약에라도 파싱키를 정확하게 알지 못한다면, 값을 구하지 못하는 상황이 생길 것으로 생각하고 있었다.

여기서 추가적으로 AppleDeveloper에서 URLResponse 값으로 검색해서 보니,
URLResponse > suggestedFilename 이라는 값이 존재하였다.

suggestedFilename


iOS 2.0부터 있던 정보인데, 이쪽으로는 크게 생각을 못했던것 같다. 이참에 사용해보았는데, 정상적으로 구분해서 filename을 구해올 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager HEAD:stringUrl parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation) {
    // 첨부파일 filename 가져오는 정보
    fileName = operation.response.suggestedFilename;
            
    // 첨부파일 다운로드 하기위한 path정보.
    // stringUrl = 기존 링크에서 나오는 url 정보
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *path2 = [NSString stringWithFormat:@"%@/download/%@",[paths objectAtIndex:0], fileName];
    [self downloadFile:stringUrl path2:path2];
            
            
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
    NSLog(@"");
}];
cs

댓글