Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование WinInet для извлечения имени файла через заголовки Content-Disposition

Delphi , ОС и Железо , Windows

Вопрос, с которым вы столкнулись, связан с необходимостью загрузки файла по URL, где имя файла не указано напрямую в адресе. Примером такого URL может служить http://server.com/settings/files/1, и хотя в веб-браузере можно определить имя файла для загрузки, например, scheme_563.txt, вы столкнулись с трудностями при попытке извлечь это имя, используя функции WinInet, такие как HttpQueryInfo.

Решение проблемы

Для решения вашего вопроса можно использовать заголовок HTTP Content-Disposition, который содержит информацию о том, как клиент должен обрабатывать тело сообщения. В частности, этот заголовок может содержать параметр filename, который указывает имя файла, которое должно быть использовано при сохранении содержимого ответа. Пример такого заголовка:

Content-Disposition: attachment; filename=fname.ext

Шаги для извлечения имени файла:

  1. Отправьте HTTP GET или HEAD запрос к серверу, чтобы получить необходимые заголовки.
  2. Используйте функцию HttpQueryInfo с параметром HTTP_QUERY_CONTENT_DISPOSITION, чтобы получить значение заголовка Content-Disposition.
  3. Извлеките имя файла из полученной строки, обрабатывая параметр 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:14:41/0.00506591796875/1