2

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

所以,一定是后缀引起的问题???

如果这是问题所在,我似乎无法在类中找到一种方法来下载正确的文件名,但是在将其呈现给浏览器时进行更改(使用 .backup 或 .db 之类的后缀或其他有效的名称)。

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

4

3 回答 3

4

正确的方法是在异步文件类中使用 httpHeaders 覆盖:

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

    return [NSDictionary dictionaryWithObjectsAndKeys:value, key, nil];
}
于 2010-01-26T04:04:34.327 回答
1

我有同样的问题并通过更改客户端代码解决了它。在客户端,我将下载属性添加到标签。

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

例如:

<a href="/get" download="file.backup">Download</a> 
于 2015-02-01T17:52:59.080 回答
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);
            }

        }
于 2009-11-23T00:13:06.680 回答