ASP (Active Server Page) — продукт Microsoft. Поскольку его легко программировать и можно быстро разрабатывать динамические веб-сайты с мощными функциями, многие веб-сайты (особенно интрасети и экстрасети) теперь используют модель NT+IIS+ASP, что делает ASP лучшим решением. текущий Самый популярный язык сценариев для разработки веб-сайтов. В WEB-сервисах служба загрузки файлов является очень распространенной функцией, но PWS под WIN9X не предоставляет связанных компонентов. IIS под NT предоставляет Post; Компонент Acceptor, но его непросто использовать, поскольку он проверяет права доступа пользователя к WWW. Вы также можете загрузить соответствующие компоненты из Интернета, но большинство из них являются коммерческими компонентами, а те, которые используются для загрузки, являются пробными версиями; время или Существуют ограничения по функционалу. Поскольку ASP может вызывать стандартные компоненты OLE/COM, мы можем использовать расширенные инструменты программирования, такие как VB/VC/DELPHI, для настройки наших собственных компонентов загрузки файлов ASP в соответствии с нашими собственными требованиями для удовлетворения требований нашей собственной системы приложений.
Ниже будут обсуждаться принцип и конкретный процесс реализации использования DELPHI для разработки компонентов загрузки файлов для ASP.
1. Принцип реализации загрузки файлов
Загрузка данных через Интернет должна соответствовать стандарту RFC1867, и данные загружаемых файлов не являются исключением. Например, используйте следующий файл страницы HTML (delphiup.htm), чтобы выбрать файл для загрузки:
<!-- DelphiUp.htm: Интерфейс загрузки файлов -->
<html><head><title>Загрузка файла</title></head><body>
Реализуйте загрузку файлов с помощью компонента загрузки файлов, написанного на DELPHI.
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>Сохранить файл как: <input TYPE=text NAME="SaveAs">
<p>Выберите файл для загрузки: <input TYPE=file NAME="FileData">
<input type="submit" name="b1" value="Подтвердить загрузку"> </p>
</форма>
</body></html>
Когда клиент выбирает файл (например, Test.TXT, содержимое которого «Вот содержимое файла для загрузки») и нажмите
После того, как кнопка «Подтвердить загрузку» отправит данные, данные, полученные серверной программой, будут иметь следующий вид:
--------------------------7cf1d6c47c#13#10
Content-Disposition: form-data; name="SaveAs"#13#10#13#10
НовоеИмяФайла#13#10
--------------------------7cf1d6c47c#13#10
Content-Disposition: данные формы; имя = "FileData" имя файла = "D: est.txt";
Тип контента: текст/обычный#13#10#13#10
Вот содержимое файла для загрузки. #13#10
--------------------------7cf1d6c47c#13#10
Content-Disposition: form-data; name="b1"#13#10#13#10
Подтвердить загрузку#13#10
--------------------------7cf1d6c47c--
Среди них «--------------------------------7cf1d6c47c» — это разделитель, используемый для разделения каждого поля в форме ( Форма);
#13#10 — это DELPHI-представление символов возврата каретки и перевода строки. Мы можем думать об этом так: информационное описание каждого поля формы начинается с разделителя плюс пара символов возврата каретки и перевода строки #13#10; доменное имя формы начинается с «name="» и заканчивается на «»»; ; поле формы Значение начинается с двух пар символов возврата каретки и перевода строки #13#10#13#10 и заканчивается парой символов возврата каретки и перевода строки #13#10# плюс имя файла; начинается с "filename="" и заканчивается на """ в конце. С помощью этих флагов мы можем получить имя и значение поля формы, а также имя загружаемого файла, чтобы данные файла можно было прочитать и сохранить.
2. Осуществление процесса загрузки файлов
После понимания упомянутого выше формата данных нам больше не составляет труда самостоятельно написать компонент загрузки файлов.
(1) Запустите проект по созданию компонента ASP.
Если вы не знакомы с этапами использования DELPHI для разработки OLE Automation Server, обратитесь к статье «Использование DELPHI для разработки OLE Automation Server для ASP» в журнале «Электроника и компьютеры», выпуск 06, 1999 г.
Здесь мы лишь кратко представим эти шаги.
1. Создайте проект библиотеки ActiveX.
В DELPHI выберите меню File="New...", выберите "Библиотека ActiveX" на вкладке ActiveX диалогового окна "Новый элемент", и DELPHI автоматически создаст проект DLL PRoject1.
2. Создайте компоненты автоматизации.
В DELPHI выберите меню File="New...", выберите "Объект автоматизации" на вкладке ActiveX диалогового окна "Новый элемент"; затем введите имя класса (например, "UploadFile") в "Мастере объектов автоматизации". В диалоговом окне «Инстансирование» выберите «Несколько Экземпляр». После нажатия кнопки «ОК» DELPHI автоматически создаст файл TLB (библиотеки типов) Project1_TLB.PAS и файл PAS (Unit) Unit1.PAS. В окне проектирования библиотеки типов переименуйте Project1 в MyUpload, затем регистрационный код OLE компонента загрузки файлов — «MyUpload.UploadFile».
3. Внедрить библиотеку типов ASP.
Чтобы использовать пять встроенных объектов ASP (запрос, ответ, сервер, приложение, сеанс), необходимо ввести библиотеку типов ASP. В основном мы используем объект Request для чтения данных, передаваемых от клиента на сервер.
Выберите «Импортировать библиотеку типов» в меню «Проект» и выберите «Библиотека объектов Microsoft Active Server Pages (версия)» в списке «Библиотеки типов» диалогового окна «Импорт библиотеки типов». 2.0)" (если этот параметр недоступен, убедитесь, что на вашем компьютере установлен IIS3 или более поздняя версия или PWS4 или более поздняя версия и ASP.DLL зарегистрирован правильно), D ELPHI автоматически создаст файл TLB ASPTypeLibrary_TLB.PAS, который содержит необходимое нам объявление типа объекта ASP.
4. Определите процессы OnStartPage и OnEndPage.
При использовании Server.CreateObject для создания экземпляра объекта OLE на странице ASP веб-сервер вызывает свой метод OnStartPage и передает объекту информацию о среде приложения ASP. , мы можем получить информацию о клиенте во время этого процесса; когда экземпляр объекта OLE высвобождается на странице ASP, веб-сервер вызывает его метод OnEndPage, и во время этого процесса мы можем выполнять конечные операции, такие как освобождение памяти. В нашем компоненте нам нужно использовать его метод OnStartPage.
Метод OnStartPage должен быть определен в Unit1.PAS. Прототип функции OnStartPage:
процедура OnStartPage (AScriptingContext: IUnknown);
Параметр AScriptingContext — это переменная типа IScriptingContext, включающая пять атрибутов (запрос, ответ, сервер, приложение, сеанс), соответствующих пяти встроенным одноимённым объектам в ASP.
Нам нужно добавить метод OnStartPage в IUploadFile в окне определения TLB (View="Type Library), а его оператором объявления будет "procedure OnStartPage(AScriptingContext: IUnknown);".
(2) Извлеките данные, загруженные клиентом.
Эту работу можно выполнить в процессе OnStartPage.
Используя свойство TotalBytes (длина содержимого информации запроса) и метод BinaryRead в свойстве Request (тип IRequest) AScriptingContext, данные информации запроса, загруженные клиентом, могут быть прочитаны в массив типа Byte, а затем формат данных, определенный RFC1867. стандарт для анализа и извлечения данных.
1. Сначала определите несколько частных переменных TUploadFile.
Добавьте ссылку на ASPTypeLibrary_TLB.PAS (Uses) в файл модуля UP01.PAS (сохраненный Unit1.PAS),
тогда присоединяйся
частный
FContentLength: LongInt; //Длина содержимого запроса
FContentData: Variant; // Данные содержимого, хранят содержимое запроса в виде массива.
FFileName, //Имя загружаемого файла
FDelimeter: string; //Разделитель полей формы
FScriptingContext: IScriptingContext;//ASP обрабатывает контекстное содержимое
FFileDataStart, //Начальная позиция данных файла
FFileDataEnd: LongInt; //Конечная позиция данных файла;
2. Извлеките данные запроса, загруженные клиентом.
//В событии OnStartPage получаем информацию о контексте ASP, информационное содержимое запроса, разделители полей формы и данные файла
процедура TUploadFile.OnStartPage(AScriptingContext: IUnknown);
вар
ARequest: IRequest; //Объект WWW-запроса
AOleVariant: OleVariant; //Запись длины информационного содержимого запроса
intDelimterLength: целое число; // Длина разделителя
longIndex,ALongInt,longPos: LongInt;
ContentData: AnsiString;//Строковое представление информационного содержимого запроса
стрТемп: строка;
FindEndOfFileData: boolean;//Найдена ли конечная позиция данных файла
начинать
//Извлекаем данные запроса, загруженные клиентом
FScriptingContext := AScriptingContext as IScriptingContext;//Получаем информацию о контексте ASP
ARequest := FScriptingContext.Request;//Получить информацию WWW-запроса
FContentLength := ARequest.TotalBytes;//Длина содержимого запроса
//Создаем динамический массив для хранения информационного содержимого запроса в виде массива
FContentData := VarArrayCreate([0,FContentLength], varByte);
//Сохраняем содержимое запроса в массив
AOleVariant: = FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);//Читаем информационное содержимое запроса
//Преобразуем содержимое запроса в строку для удобства позиционирования
КонтентДанные := ';
для longIndex:= от 0 до FContentLength - 1 делать
начинать
ContentData:= ContentData + chr(Byte(FContentData[longIndex]));
если FContentData[ longIndex ] = 0, то разрыв;//0 указывает на конец содержимого
конец;
3. Получите разделитель и загрузите имя файла.
//Получаем разделитель поля формы
longPos := pos( #13#10,ContentData );//Положение символа возврата каретки и перевода строки
FDelimeter := Copy( ContentData,1,longPos-1);//Содержимое перед этой позицией является разделителем
//Получаем имя файла по исходному пути. В информационном содержимом запроса имя файла начинается с.
//Хранилище в виде filename="path/filename"
strTemp := 'filename="';//Имя файла следует после "filename=""
longPos := pos( strTemp, ContentData );//Получаем позицию "filename=""
если longPos <= 0, то
начинать
FFileName := ';
ФФиледатастарт := -1;
ФФиледатаенд := -2;
Выход;
конец;
//Получаем содержимое перед следующей двойной кавычкой """, то есть имя файла с исходным путем
longPos := longPos + длина(strTemp);
стрТемп := ';
для longIndex:= longPos to FContentLength - 1 сделать
если ContentData[ longIndex ] <> '"' тогда
strTemp := strTemp + ContentData[ longIndex ]
иначе сломаться;
FFileName: = strTemp;
4. Получите начальную и конечную позиции данных файла в информационном содержимом запроса.
//Начальная позиция данных файла находится после первого #13#10#13#10 после имени файла
удалить (ContentData, 1, longIndex);
стрТемп := #13#10#13#10;
FFileDataStart:= longIndex + pos(strTemp, ContentData) + длина(strTemp) - 1;
//Конечная позиция данных файла находится перед следующим #13#10 и разделителем
//Поскольку данные файла могут содержать недопустимые символы, функцию позиционирования строки POS больше нельзя использовать.
//Находим позицию следующего разделителя
FFileDataEnd := FFileDataStart;
intDelimterLength := длина(FDelimeter);
FindEndOfFileData: = ложь;
в то время как FFileDataEnd <= FContentLength - intDelimterLength do
начинать
FindEndOfFileData: = true;
для ALongInt:= от 0 до intDelimterLength - 1 сделать
if Byte(FDelimeter[ALongInt + 1]) <>
FContentData[FFileDataEnd + ALongInt], затем
начинать
FindEndOfFileData: = ложь;
перерыв;
конец;
если FindEndOfFileData, то разрыв;
FFileDataEnd:= FFileDataEnd + 1;
конец;
если не FindEndOfFileData, то FFileDataEnd := FFileDataStart - 1 // Разделитель не найден
else FFileDataEnd := FFileDataEnd - 3;//Разделитель, переход вперед #13#10
конец;
(3) Передача информации в программу ASP.
После выполнения операции (2) наш компонент загрузки может передавать данные в программу ASP в соответствии с ее требованиями. Доступные на данный момент данные включают: имя исходного файла клиента (FFileName, включая путь), размер файла (FFileDataEnd-FFileDataStart+1).
Во-первых, следующие два метода GetFileName и GetFileSize должны быть объявлены в окне проектирования TLB.
1. Верните имя исходного файла клиента (включая путь).
//Вернем имя исходного файла клиента (включая путь)
функция TUploadFile.GetFileName: OleVariant;
начинать
result := FFileName;//Имя исходного файла клиента (включая путь)
конец;
2. Возврат размера файла
//Вернем размер файла (байты)
функция TUploadFile.GetFileSize: OleVariant;
начинать
результат: = FFileDataEnd - FFileDataStart + 1;
конец;
(4) Сохранение файлов
После выполнения операции (2) наш компонент загрузки может сохранить файл в соответствии с требованиями программы ASP. Сначала оно должно быть в
Следующие два метода, SaveFileAs и SaveFile, объявляются в окне проектирования TLB.
1. Сохраните файл в соответствии с указанным именем файла.
//Сохраняем файл в соответствии с указанным именем файла. Параметр FileName — это указанное имя файла. Возвращаемое значение True указывает, что файл сохранен успешно.
функция TUploadFile.SaveFileAs(FileName: OleVariant): OleVariant;
вар
длинныйИндекс: ЛонгИнт;
AFile: файл байтов;//Сохраняем файл в двоичной форме
байтДанные: Байт;
начинать
результат: = правда;
пытаться
назначить (AFile, FileName);
переписать (AFile);
для longIndex: = от FFileDataStart до FFileDataEnd do
начинать
byteData:= Байт(FContentData[longIndex]);
Запись (AFile, byteData);
конец;
ЗакрытьФайл(AFile);
кроме
результат: = ложь;
конец;
конец;
2. Сохраните файл с именем по умолчанию.
//Сохраняем файл с именем файла по умолчанию и сохраняем файл с тем же именем в каталоге, где находится вызывающая страница
функция TUploadFile.SaveFile: OleVariant;
вар
ТекущийПутьФайла: строка;
начинать
//Получаем каталог, в котором находится вызывающая страница
CurrentFilePath: = FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
Путь к текущему файлу: = Путь к текущему файлу (Путь к текущему файлу);
//сохраняем файл
результат: = SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
конец;
3. Примеры применения компонентов загрузки
В нашем примере DelphiUp.HTM — это интерфейс загрузки файлов, а DelphiUp.ASP используется для выполнения операций загрузки файлов.
Код DelphiUp.ASP выглядит следующим образом:
<!--DelphiUp.ASP: Страница обработки загрузки файла -->
<html><head><title>Загрузка файла</title></head><body>
<% dim Загрузка, Имя файла
set Upload = Server.CreateObject("MyUpload.UploadFile")
ИмяФайла = Загрузить.ПолучитьИмяФайла
Response.Write "<br>Сохранение файла ""&FileName&""...."
если Загрузить.СохранитьФайл, то
Response.Write "<br>Файл ""&FileName&"" успешно загружен."
Response.Write "<br>Размер файла составляет "&Upload.GetFileSize&" байт."
еще
Response.Write "<br>Файл ""&FileName&"" не удалось загрузить."
конец, если
установить Загрузить=ничего %>
</body></html>
4. Некоторые пояснения
1. Размер файла DLL, скомпилированного из исходного кода, автоматически сгенерированного DELPHI, составляет 215 КБ, его можно найти в
В разделе «Интерфейс» файла ASPTypeLibrary_TLB.PAS удалите все модули в разделе «Использование», кроме ActiveX.
Удалив все модули в разделе «Использует» в MyUpload_TLB.PAS, размер созданного файла DLL можно уменьшить до 61 КБ.
2. Описанный выше метод также применим к программам CGI, но необходимо использовать объект TWebRequest.
Вышеуказанная программа была отлажена и передана под PWIN98+Delphi3.0+PWS4.0.