在 Cocoahttpserver 中更改下载文件名

Posted

技术标签:

【中文标题】在 Cocoahttpserver 中更改下载文件名【英文标题】:Change Download File Name in Cocoahttpserver 【发布时间】:2009-11-22 23:11:46 【问题描述】:

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

那么,一定是后缀引起的问题???

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

有人知道在类中的什么位置更改下载文件名,这样浏览器(Safari)就不会称它为“未知”吗?谢谢。

【问题讨论】:

【参考方案1】:

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

- (NSDictionary *)httpHeaders

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

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

【讨论】:

【参考方案2】:

我找到了其他人的代码 (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);
            

        

【讨论】:

【参考方案3】:

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

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

例如:

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

【讨论】:

以上是关于在 Cocoahttpserver 中更改下载文件名的主要内容,如果未能解决你的问题,请参考以下文章

将文件保存到 iphone 中的 cocoahttpserver

利用CocoaHttpServer搭建手机本地服务器

在 iOS 上使用 CocoaHTTPServer 共享文件?

Cocoahttpserver 提供来自 iPhone App Bundle 的图像

WiFi文件上传框架SGWiFiUpload

Objective-C/CocoaHTTPServer - 是不是可以在没有任何 UI 的情况下将 CocoaHTTPServer 作为后台应用程序运行?