从Content-Disposition标头中获取文件名

时间:2012-04-23 10:26:29

标签: iphone objective-c ios xcode

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

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

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

3 个答案:

答案 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"

您已经完成。请注意,尽管文档中有说明,但返回值是可选的,因此如果您敢(我不会),则必须提供默认值或强制打开。

来自documentation

该方法首先使用以下命令检查服务器是否已指定文件名: 内容处置头。如果没有使用该机制指定有效的文件名, 此方法检查URL的最后一个路径部分。如果没有有效的文件名 使用最后一个路径组件获得,此方法使用URL的主机作为文件名。 如果无法将URL的主机转换为有效的文件名,则使用文件名“未知”。 在某些情况下,此方法将根据MIME类型附加适当的文件扩展名。 此方法始终返回有效的文件名。

相关问题