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