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 に答える
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 に答える