2012-04-23 28 views
0

我目前正在檢查這個標題,如果它可用,我會嘗試從它獲取文件名。問題是,檢索它的最好方法是什麼?我瞭解Content-Disposition標題可能會以不同的參數出現。下面的例子:從Content-Disposition標題獲取文件名

Content-Disposition = "inline; filename=sample-file-123.pdf" 
Content-Disposition = "attachment; filename="123.zip"" 

我只想獲取文件名。

回答

3

我會做一些沿着這個線路:

- (NSString *)getFilenameFrom:(NSString *)string { 
    NSRange startRange = [string rangeOfString:@"filename="]; 

    if (startRange.location != NSNotFound && startRange.length != NSNotFound) { 
     int filenameStart = startRange.location + startRange.length; 
     NSRange endRange = [string rangeOfString:@" " options:NSLiteralSearch range:NSMakeRange(filenameStart, [string length] - filenameStart)]; 
     int filenameLength = 0; 

     if (endRange.location != NSNotFound && endRange.length != NSNotFound) { 
      filenameLength = endRange.location - filenameStart; 
     } else { 
      filenameLength = [string length] - filenameStart; 
     } 

     return [string substringWithRange:NSMakeRange(filenameStart, filenameLength)]; 
    } 
    return nil; //or return @"", whatever you like 
} 

你必須檢查它,因爲我在瀏覽器中做這個(不訪問的Xcode大氣壓)。

+0

謝謝,我修改了上面的答案,以滿足發送Content-Disposition頭的情況,但沒有filename參數。 – XCool 2012-04-24 02:15:05

+0

我糾正了上面的代碼返回文件名沒有'「」..順便說一句,謝謝dragon112 :) – Gabrail 2013-01-29 13:06:13

2
+ (NSString *)filenameFromContentDispositionHeader:(NSString *)contentDispositionHeader { 
    NSString *pattern = @"filename=\"(.*)\""; 
    NSRegularExpression *regex = 
     [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil]; 
    NSTextCheckingResult *result = 
     [regex firstMatchInString:contentDispositionHeader 
         options:0 
          range:NSMakeRange(0, contentDispositionHeader.length)]; 
    NSRange resultRange = [result rangeAtIndex:0]; 

    if (resultRange.location == NSNotFound) { 
    return nil; 
    } else { 
    return [contentDispositionHeader substringWithRange: 
     NSMakeRange(resultRange.location + 10, resultRange.length - 11)]; 
    } 
} 

請注意,如果無法確定文件名是否用雙引號括起來,則需要修改該模式。