更改Cocoahttpserver中的下载文件名

时间:2009-11-22 23:11:46

标签: iphone safari cocoahttpserver

我在iphone应用程序中使用cocoahttpserver,但是当我尝试下载它时(通过单击标准演示应用程序中的链接),我的sqlite文件(myDatabase.sqlite)以“未知”的形式到达我的Mac桌面完全没有后缀。但是,当我“另存为...”时,它提供的名称很好。我希望它用sqlite后缀保存文件。

所以,它必须是导致问题的后缀????

如果这是问题,我似乎无法在类中找到一种方法来下载正确的文件名,然后在将它呈现给浏览器时更改它(带有后缀,如.backup,或.db,或者是作品)。

任何人都知道在哪些类中更改下载文件名,以便浏览器(Safari)不会将其称为“未知”?感谢。

3 个答案:

答案 0 :(得分:4)

执行此操作的正确方法是在异步文件类中使用httpHeaders覆盖:

- (NSDictionary *)httpHeaders
{
    NSString *key = @"Content-Disposition";
    NSString *value = [NSString stringWithFormat:@"attachment; filename=\"%@\"", [filePath lastPathComponent]];

    return [NSDictionary dictionaryWithObjectsAndKeys:value, key, nil];
}

答案 1 :(得分:1)

我找到了其他人的代码(MyAppSales),并在replyToHTTPRequest中,我添加了Content-Disposition标头,如下所示(在方法的一个部分中),现在它可以工作了!

if(!isRangeRequest)
        {
            // Status Code 200 - OK
            response = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 200, NULL, kCFHTTPVersion1_1);

            NSString *contentLengthStr = [NSString stringWithFormat:@"%qu", contentLength];
            CFHTTPMessageSetHeaderFieldValue(response, CFSTR("Content-Length"), (CFStringRef)contentLengthStr);

            // ************* added this from MyAppSales
            if ([httpResponse isKindOfClass:[HTTPFileResponse class]])
            {
                NSString *baseName = [(NSString *)[(HTTPFileResponse *)httpResponse filePath] lastPathComponent];

                NSString *contentDispoStr = [NSString stringWithFormat:@"Content-Disposition: attachment; filename=\"%@\"", baseName];
                CFHTTPMessageSetHeaderFieldValue(response, CFSTR("Content-Disposition"), (CFStringRef)contentDispoStr);
            }

        }

答案 2 :(得分:1)

我遇到了同样的问题,并通过更改客户端代码解决了这个问题。在客户端,我将下载属性添加到代码中。

<a href="/get" download="FILE_NAME">Download</a> 

例如:

<a href="/get" download="file.backup">Download</a>