在 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
在 iOS 上使用 CocoaHTTPServer 共享文件?
Cocoahttpserver 提供来自 iPhone App Bundle 的图像
Objective-C/CocoaHTTPServer - 是不是可以在没有任何 UI 的情况下将 CocoaHTTPServer 作为后台应用程序运行?