1

我目前正在检查此标头,如果可用,我将尝试从中获取文件名。问题是,检索它的最佳方法是什么?我了解 Content-Disposition 标头可能会出现不同的参数。以下示例:

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

我只对获取文件名感兴趣。

4

3 回答 3

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)。

于 2012-04-23T10:43:12.873 回答
3

有一个专用的 API:URLResponse.suggestedFilename

因此,如果您从 URLResponse 获取标头,则只需调用

let filename: String = response.suggestedFilename ?? "default"

你就完成了。请注意,尽管文档说了什么,但返回值是可选的,因此如果您敢(我不会),您必须提供默认值或强制展开。

文档中:

该方法首先检查服务器是否使用内容处置标头指定了文件名。如果使用该机制未指定有效文件名,则此方法检查 URL 的最后一个路径组件。如果使用最后一个路径组件无法获得有效的文件名,则此方法使用 URL 的主机作为文件名。如果 URL 的主机无法转换为有效的文件名,则使用文件名“未知”。在大多数情况下,此方法会根据 MIME 类型附加正确的文件扩展名。此方法总是返回一个有效的文件名。

于 2020-11-25T20:42:55.967 回答
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)];
  }
}

请注意,如果您不能确定文件名是否用双引号括起来,则需要修改模式。

于 2015-12-29T16:04:13.987 回答