Главная » Delphi » Загрузка файлов WebSnap

2

В прошлом, одной  из самых сложных задач при разработке Web приложений была передача файла  от клиента на сервер. Чаще  всего  для этого  использовались недоку ментированные возможности спецификации HTTP, которые требовали очень  тща тельной побитовой передачи информации. Как и следовало ожидать, WebSnap  реша ет и эту задачу легко и просто. WebSnap  содержит все функции, необходимые для за грузки  файла, внутри  класса  TAdapter, поэтому  осуществить передачу  файла  ничуть не сложнее, чем загрузить его в поток.

Создадим  в приложении, как обычно, новую страницу, которая будет передавать файлы от клиента на сервер. Назовем эту страницу Upload и разместим в ней генера тор  типа  TAdapterPageProducer. Сохраним файл  как wmUpload. Перенесем в фор му компонент TAdapter и назовем его AdapterFileField. Это поле будет управлять всей загрузкой файлов, выбранных на клиенте. Кроме  того,  назначим адаптеру  одно действие и назовем его UploadAction.

Теперь добавим  в форму  AdapterForm компоненты AdapterErrorList, Adapter-

FieldGroup и AdapterCommandGroup. Первые два подключим к Adapter1, а Adapter-

CommandGroup — к AdapterFieldGroup. Затем добавьте в AdapterFieldGroup все поля,

а в AdapterCommandGroup все  действиям. Измените  название кнопки на  Upload File

(Загрузить файл). То, что должно получиться в результате в окне Web дизайнера, пред

ставлено на рис. 23.17.

Рис. 23.17. Страница Upload в окне Web дизайнера. Кнопка Browse

добавлена автоматически

Код можно добавить в двух местах. В обработчике события OnFileUpload компо

нента Adapter1.AdapterFileField этот код может выглядеть подобно листингу 23.5.

Листинг 23.5. Обработчик события OnFileUpload

procedure TUpload.AdapterFileField1UploadFiles(Sender: TObject; Files: TUpdateFileList);

var

i: integer;

CurrentDir: string;

Filename: string;

FS: TFileStream;

begin

// Здесь происходит загрузка файла

if Files.Count <= 0 then

raise Exception.Create(‘Not any files to be uploaded’);

for i := 0 to Files.Count – 1 do begin

// Удостовериться, что это файл .jpg или .jpeg

if (CompareText(ExtractFileExt(Files.Files[I].FileName),

‘.jpg’) <> 0) and (CompareText(ExtractFileExt(

Files.Files[I].FileName), ‘.jpeg’) <> 0) then

Adapter1.Errors.AddError(

‘You must select a JPG or JPEG file to upload’);

else begin

CurrentDir := ExtractFilePath(GetModuleName(HInstance)) +

‘JPEGFiles';

ForceDirectories(CurrentDir);

FileName := CurrentDir + ‘\’ +

ExtractFileName(Files.Files[I].FileName);

FS := TFileStream.Create(Filename,fmCreate or fmShareDenyWrite);

try

// 0 = копировать все с самого начала

FS.CopyFrom(Files.Files[I].Stream, 0);

finally

FS.Free;

end;

end;

end;

end;Сначала  этот  код проверяет, выбран ли файл, и если  это  так,  то  является ли он файлом .jpg или .jpeg. Удостоверившись, что  так и есть,  он получает имя файла  и проверяет наличие каталога назначения. Если каталог существует, то файл передается в поток  TFileStream. Все основные действия происходят внутри  экземпляра класса TUpdateFileList, который управляет всеми  таинственными процессами HTTP, не обходимыми для загрузки файл от клиента на сервер.

Вторым местом  для  добавления кода  является обработчик события OnExecute

действия UploadAction компонента Adapter1. Вот этот код:

procedure TUpload.UploadActionExecute(Sender: TObject; Params: TStrings);

begin

Adapter1.UpdateRecords;

end;

Он просто сообщает компоненту Adapter1 о необходимости обновить свои запи

си и получить необходимые файлы.

Применение специальных шаблонов

Как уже, вероятно, заметил читатель, создавая в мастере новую страницу, можно выбрать для приложения либо  стандартный шаблон  HTML,  либо  пустой.  Стандарт ный  шаблон  хорош  для демонстрационного приложения в настоящей главе,  но при разработке более  сложных сайтов  понадобится способ  автоматически подключить свои  собственные шаблоны HTML  при  добавлении страниц в приложение. WebSnap позволяет и это.

Создав и зарегистрировав в пакете  времени разработки класс,  производный от TProducerTemplatesList, появляется возможность добавлять новые  шаблоны, ко торые впоследствии можно  будет выбирать и использовать в мастере новых  страниц. Демонстрационный пакет  расположен в каталоге <Delphi>\Demos\WebSnap\Pro- ducer Template. Его можно  просмотреть и,  при  необходимости, добавить в файл RC свои  собственные шаблоны HTML  или  сценарии, содержащийся в пакете. Обра тите  внимание: для компиляции этого  пакета  необходимо сначала  откомпилировать пакет  <Delphi>\Demos\WebSnap\Util\TemplateRes.dpk. После  компиляции и ус тановки этих  пакетов появится большое количество дополнительных шаблонов, ко торые можно будет выбирать в мастере новых  страниц.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии

Комментариев 2

  1. harvester says:

    Не вижу вызова конструктора FS, а деструктор есть. Это точно рабочий код?

    • Vadik says:

      Было ” ExtractFileName(Files.Files[I].FileName);FS := TFileStream.Create(Filename,” исправил (не было переноса строки) , спасибо что обратили внимание.