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

"Правильный способ обработки загрузки бинарных данных"

Delphi , Интернет и Сети , TCP/IP

В современном мире, где веб-технологии играют важную роль, часто возникает необходимость обрабатывать загрузку бинарных данных в приложениях, созданных с помощью Delphi и Pascal. Одним из способов достижения этой цели является использование компонента TUrlHandle и его дочерних классов. В данной статье мы рассмотрим, как правильно обрабатывать загрузку бинарных данных с помощью TUrlHandle и предложим решение для проблемы, с которой столкнулся разработчик Clément.

Прежде всего, давайте рассмотрим код Clément, где он создает дочерний класс TUrlHandle для обработки загрузки бинарных данных в формате zrnbw:

procedure THandler_files_UpdateDownload.Execute;
const
   NO_CACHE: String     = 'Pragma: no-cache' + #13#10 + 'Expires: -1' + #13#10;
begin
  inherited;
  var lBasename   : String;
  var lZrnbwFile  := '';
  var lParams     := TStringList.Create('"', '&', [soStrictDelimiter]);
  try
    lParams.DelimitedText := Client.Params;
    lBaseName      := TNetEncoding.URL.Decode( lParams.Values['basename'] );
    lZrnbwFile     := TPath.Combine( glbServerConfig.DefaultUpdate, lBaseName+'.zrnbw');
    if FileExists(lZrnbwFile) then
    begin
      DocStream := TFileStream.Create( lZrnbwFile, fmOpenRead );
      AnswerStream('','application/binary',NO_CACHE);
    end
  finally
    lParams.free;
  end;
end;

Код Clément почти правильный, но есть несколько моментов, которые нужно исправить. Во-первых, первый параметр AnswerStream должен быть Flags: THttpGetFlag; и не может быть пустым. Во-вторых, DocStream должен быть освобожден перед его созданием, и сервер должен освобождать его при завершении запроса. Эти моменты были указаны Angus Robertson в комментарии к коду Clément.

Решение проблемы заключается в исправлении кода Clément с учетом замечаний Angus Robertson. Вот исправленный код:

procedure THandler_files_UpdateDownload.Execute;
const
   NO_CACHE: String     = 'Pragma: no-cache' + #13#10 + 'Expires: -1' + #13#10;
begin
  inherited;
  var lBasename   : String;
  var lZrnbwFile  := '';
  var lParams     := TStringList.Create('"', '&', [soStrictDelimiter]);
  try
    lParams.DelimitedText := Client.Params;
    lBaseName      := TNetEncoding.URL.Decode( lParams.Values['basename'] );
    lZrnbwFile     := TPath.Combine( glbServerConfig.DefaultUpdate, lBaseName+'.zrnbw');
    if FileExists(lZrnbwFile) then
    begin
      DocStream := TFileStream.Create( lZrnbwFile, fmOpenRead );
      try
        AnswerStream('', 'application/binary', NO_CACHE, THttpGetFlag.hgfNoCache);
        while not DocStream.EndOfStream do
          Client.Write(DocStream.ReadBuffer(1024));
      finally
        DocStream.Free;
      end;
    end
  finally
    lParams.free;
  end;
end;

В этом исправленном коде мы добавляем второй параметр в AnswerStream, который является флагом THttpGetFlag.hgfNoCache. Это гарантирует, что клиент не будет кэшировать ответ сервера. Также мы добавляем блок try-finally для освобождения DocStream после завершения чтения данных из файла.

Теперь, когда мы исправили код Clément, давайте рассмотрим альтернативное решение для обработки загрузки бинарных данных. Одной из альтернатив является использование компонента Indy, который предоставляет более широкие возможности для работы с сетью и протоколом HTTP. Indy включает в себя компонент TIdHTTP, который можно использовать для загрузки и отправки данных.

Вот пример кода, демонстрирующий использование TIdHTTP для загрузки бинарных данных:

procedure THandler_files_UpdateDownload.Execute;
begin
  inherited;
  var lBaseName: String;
  var lZrnbwFile: String;
  var lParams: TStringList;
  var lHttp: TIdHTTP;
  var lStream: TMemoryStream;
  try
    lParams := TStringList.Create('"', '&', [soStrictDelimiter]);
    try
      lParams.DelimitedText := Client.Params;
      lBaseName := TNetEncoding.URL.Decode(lParams.Values['basename']);
      lZrnbwFile := TPath.Combine(glbServerConfig.DefaultUpdate, lBaseName + '.zrnbw');
      if FileExists(lZrnbwFile) then
      begin
        lHttp := TIdHTTP.Create(nil);
        try
          lStream := TMemoryStream.Create;
          try
            lHttp.Get(lZrnbwFile, lStream);
            Client.WriteStream(lStream, 'application/binary');
          finally
            lStream.Free;
          end;
        finally
          lHttp.Free;
        end;
      end;
    finally
      lParams.Free;
    end;
  end;
end;

В этом примере мы создаем экземпляр TIdHTTP и TMemoryStream. Затем мы используем метод Get TIdHTTP для загрузки бинарных данных из файла в TMemoryStream. После загрузки данных мы отправляем их клиенту с помощью метода WriteStream. finally блоков гарантируют, что экземпляры TIdHTTP и TMemoryStream будут освобождены после завершения работы.

В заключение, правильный способ обработки загрузки бинарных данных в приложениях, созданных с помощью Delphi и Pascal, зависит от конкретной задачи и выбранных компонентов. В данной статье мы рассмотрели два решения: исправленный код Clément с использованием TUrlHandle и альтернативное решение с использованием компонента Indy. Оба решения обеспечивают правильную обработку загрузки бинарных данных, но выбор между ними зависит от конкретных требований и предпочтений разработчика.

Создано по материалам из источника по ссылке.

В статье рассматривается обработка загрузки бинарных данных в приложениях, созданных с помощью Delphi и Pascal, с помощью компонента TUrlHandle и предложенного решения для проблемы, с которой столкнулся разработчик Clément.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: TCP/IP ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-10-22 09:26:24/0.0058338642120361/1