Изменить имя файла загрузки в 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> 
Другие вопросы по тегам