Вопрос, с которым вы столкнулись, связан с необходимостью загрузки файла по URL, где имя файла не указано напрямую в адресе. Примером такого URL может служить http://server.com/settings/files/1, и хотя в веб-браузере можно определить имя файла для загрузки, например, scheme_563.txt, вы столкнулись с трудностями при попытке извлечь это имя, используя функции WinInet, такие как HttpQueryInfo.
Решение проблемы
Для решения вашего вопроса можно использовать заголовок HTTP Content-Disposition, который содержит информацию о том, как клиент должен обрабатывать тело сообщения. В частности, этот заголовок может содержать параметр filename, который указывает имя файла, которое должно быть использовано при сохранении содержимого ответа. Пример такого заголовка:
Отправьте HTTP GET или HEAD запрос к серверу, чтобы получить необходимые заголовки.
Используйте функцию HttpQueryInfo с параметром HTTP_QUERY_CONTENT_DISPOSITION, чтобы получить значение заголовка Content-Disposition.
Извлеките имя файла из полученной строки, обрабатывая параметр filename.
Пример кода на Object Pascal (Delphi):
uses
Winapi.Wininet;
// Функция для извлечения имени файла
function GetFileNameFromContentDisposition(const ContentDisposition: string): string;
var
Pos: Integer;
begin
Pos := Pos(ContentDisposition, 'filename="');
if Pos = 0 then
Exit('');
Result := Copy(ContentDisposition, Pos + 10, Length(ContentDisposition) - Pos - 9);
Pos := PosChangeFileSeq(Result, '"');
if Pos > 0 then
Result := Copy(Result, 1, Pos - 1);
end;
var
InternetSession: TInternetSession;
Request: THTTPRequest;
Response: THTTPResponse;
ContentDispositionHeader: string;
begin
InternetSession := TInternetSession.Create(nil);
try
Request := InternetSession.CreateHTTPRequest('GET', 'http://server.com/settings/files/1');
try
Response := Request.Execute;
ContentDispositionHeader := Response.RawContentHeaders;
// Извлечение заголовка Content-Disposition
ContentDispositionHeader := GetHeaderValue(ContentDispositionHeader, 'Content-Disposition');
// Получение имени файла
Writeln('Имя файла: ', GetFileNameFromContentDisposition(ContentDispositionHeader));
finally
Request.Free;
end;
finally
InternetSession.Free;
end;
end;
Обратите внимание, что имя файла может быть закодировано, и вам может потребоваться его декодировать в соответствии со стандартами кодирования (например, URL-кодирование).
Заключение
Использование заголовка Content-Disposition является эффективным способом извлечения имени файла для загрузки, когда оно не указано в URL. Следуя описанным шагам, вы сможете успешно получить и использовать это имя в процессе загрузки файлов с помощью WinInet.
Использование заголовка `Content-Disposition` в WinInet для извлечения имени файла при загрузке по URL без указания имени в адресе.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.