我正在检查此标头,如果它可用,我会尝试从中获取文件名。问题是,检索它的最佳方法是什么?我知道Content-Disposition标头可能会出现不同的参数。以下示例:
Content-Disposition = "inline; filename=sample-file-123.pdf"
Content-Disposition = "attachment; filename="123.zip""
我只对获取文件名感兴趣。
答案 0 :(得分: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 atm)。
答案 1 :(得分: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)];
}
}
请注意,如果您无法确定文件名是否用双引号括起来,则需要修改模式。
答案 2 :(得分:1)
为此提供了专用的API:URLResponse.suggestedFilename
因此,如果您是从URLResponse获取标题的,则只需致电
let filename: String = response.suggestedFilename ?? "default"
您已经完成。请注意,尽管文档中有说明,但返回值是可选的,因此如果您敢(我不会),则必须提供默认值或强制打开。
该方法首先使用以下命令检查服务器是否已指定文件名: 内容处置头。如果没有使用该机制指定有效的文件名, 此方法检查URL的最后一个路径部分。如果没有有效的文件名 使用最后一个路径组件获得,此方法使用URL的主机作为文件名。 如果无法将URL的主机转换为有效的文件名,则使用文件名“未知”。 在某些情况下,此方法将根据MIME类型附加适当的文件扩展名。 此方法始终返回有效的文件名。