Изменить имя файла загрузки в Cocoahttpserver
Я использую cocoahttpserver в приложении для iphone, но когда я пытаюсь загрузить его (нажав ссылку в стандартном демонстрационном приложении), мой файл sqlite (myDatabase.sqlite) поступает на мой рабочий стол Mac как "Неизвестно" без суффикса в все. Тем не менее, когда я "Сохранить как...", он дает имя хорошо. Я бы предпочел сохранить файл с суффиксом sqlite.
Итак, это должен быть суффикс, вызывающий проблемы????
Если это проблема, я не могу найти способ в классах загрузить правильное имя файла, НО затем изменить его при представлении его в браузере (с суффиксом, например.backup, или.db, или чем-то, что работает).
Кто-нибудь знает, где в классах изменить имя загружаемого файла, чтобы браузер (Safari) не назвал его "неизвестным"? Благодарю.
3 ответа
Я нашел чей-то код (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);
}
}
Правильный способ сделать это - использовать переопределение httpHeaders в вашем классе асинхронных файлов:
- (NSDictionary *)httpHeaders
{
NSString *key = @"Content-Disposition";
NSString *value = [NSString stringWithFormat:@"attachment; filename=\"%@\"", [filePath lastPathComponent]];
return [NSDictionary dictionaryWithObjectsAndKeys:value, key, nil];
}
У меня была та же проблема, и я решил ее, изменив код на стороне клиента. На стороне клиента я добавляю атрибут загрузки в теги.
<a href="/get" download="FILE_NAME">Download</a>
Например:
<a href="/get" download="file.backup">Download</a>