Обзор
В этой статье объясняется пример использования технологии XML для загрузки файлов. Этот метод не имеет ограничений традиционных методов. В этом примере описывается, как использовать MSXML3.0 и объект ADO Stream для реализации этого нового метода загрузки. Существует множество преимуществ, например отсутствие необходимости в специальном компоненте загрузки.
введение
Чтобы получить функцию загрузки на веб-страницах HTML, мы можем использовать следующий формат FORM на клиенте:
<FORM NAME="myForm"
ДЕЙСТВИЕ="TargetURL.asp"
ENCTYPE="многочастные/данные-формы"
МЕТОД="сообщение">
<INPUT TYPE="file" NAME="myFile">
<INPUT TYPE="отправить" VALUE="Загрузить файл">
</FORM>
Это решение имеет множество ограничений на использование как клиента, так и сервера. Во-первых, нам нужно использовать метод POST, поскольку метод GET не может обрабатывать такие данные формы. Кроме того, невозможно запустить действие POST без использования формы. После отправки данных в обработчик формы браузер загрузит обработчик как новую страницу, и пользователь увидит неприятный переход страниц.
Атрибут ENCTYPE определяет метод кодирования MIME для формы. Атрибут ENCTYPE формы для загрузки файлов должен использовать «multipart/form-data». Установка для этого атрибута значения «multipart/form-data» создает буфер POST (составную структуру), который отличается от традиционной структуры. Объект запроса ASP не может получить доступ к такому содержимому формы. Итак, мы можем использовать метод Request.binaryRead для доступа к этим данным, но не можем сделать это с помощью языка сценариев. Метод Request.binaryRead возвращает данные типа VTaray (массив типа Variant, содержащий только однобайтовые символы без знака). Но скриптовые языки могут обрабатывать только данные Variant. Чтобы решить эту проблему, вы можете использовать только выделенные компоненты загрузки ASP или расширения ISAPI, такие как CPSHOST.DLL. Это ограничение дизайна.
Новый план загрузки
должен следовать следующим шагам.
Клиент:
используйте MSXML 3.0 для создания XML-документа. Создайте XML-узел для двоичного содержимого. Используйте объект ADO Stream, чтобы поместить загруженные данные файла в узел. Используйте объект XMLHTTP для отправки XML-документа на веб-сервер
. сторона:
Считайте XML-документ из объекта Request, прочитайте данные в двоичном узле и сохраните их в файле на сервере. Конечно, мы также можем сохранить его в поле BLOB в базе данных.
Прежде чем объяснять этот код, мы можем немного подумать об этом решении.
Мысли о XML
Формат XML поддерживает множество типов данных, таких как числовые, с плавающей запятой, символьные и т. д. Многие авторы определяют XML как формат ASCII, но мы не можем игнорировать тот факт, что технология XML также может использовать тип данных «bin.base64» для описания двоичной информации. Эта функция полностью поддерживается парсером MS XML3.0, но в настоящее время требует некоторых специальных настроек. Этот объект предоставляет некоторые свойства, которые обеспечивают полный контроль над двоичными данными:
obj_node.dataType — это свойство чтения и записи определяет тип данных конкретного узла. Анализатор MSXML поддерживает больше типов данных (см. MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm ).
Для двоичных данных мы можем использовать тип «bin.base64».
obj_node.nodeTypedValue — это свойство для чтения и записи содержит данные, представляющие указанный узел в терминах указанного типа.
Мы можем создать XML-документ, содержащий несколько узлов типа bin.base64, содержащих загруженные файлы. Эта функция позволяет загружать несколько файлов одновременно, используя один POST.
Мы можем использовать объект XMLHttpRequest и метод POST для отправки XML-документа на веб-сервер. Этот объект обеспечивает поддержку протокола на стороне клиента для HTTP-сервера, позволяя отправлять и получать объекты MS XMLDOM на веб-сервере. XMLHttpRequest — это встроенный COM-объект в Internet Explorer 5 (выборочная установка не требуется), и конвертировать страницу после отправки не требуется.
Размышляя об объекте ADO Stream.
Мы можем создать XML-документ, содержащий один или несколько двоичных узлов на стороне клиента. Нам также необходимо заполнить узел содержимым файла. К сожалению, скриптовые языки не могут получить доступ к локальной файловой системе, а объект Scripting.FileSystem (встроенный объект системы Win32) до сих пор не имеет доступа к двоичным файлам. Это ограничение дизайна. Поэтому нам нужно найти другой COM-объект, который сможет предоставить доступ к локальным двоичным файлам.
Объект ADO Stream (компонент в MDAC 2.5) предоставляет средства для чтения, записи и управления данными двоичного потока. Содержимым потока байтов могут быть текстовые или двоичные данные, ограничений по емкости нет. В ADO 2.5 объект Stream, введенный Microsoft, не принадлежит ни одному из уровней структуры объекта ADO, поэтому мы можем использовать этот объект без объединения.
В этой статье объект Stream используется для доступа к содержимому файла, а затем содержимое сохраняется в узле XML.
на стороне клиента
для завершения действия отправки файла используются объекты Stream и MSXML.
<HTML>
<HEAD><TITLE>Отправка файла</TITLE></HEAD>
<ТЕЛО>
<INPUT id=btn_send name="btn_send" type=button value="FILE SEND">
<DIV id=div_message>Готово</DIV>
</ТЕЛО>
</HTML>
<SCRIPT LANGUAGE=javascript>
// Функция загрузки
функция btn_send.onclick()
{
//Создаем объект ADO-потока
var ado_stream = new ActiveXObject("ADODB.Stream");
// Создаем XML-документ, содержащий информацию заголовка по умолчанию и корневой узел
var xml_dom = новый ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
//Указываем тип данных
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes"
// Создаем новый узел и устанавливаем его как узел двоичных данных
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
//Открываем объект Stream и читаем исходный файл
ado_stream.Type = 1 // 1=adTypeBinary;
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\myfile.doc");
//Сохраняем содержимое файла в узел XML
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll;
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// Вы можете создать несколько двоичных узлов и загрузить несколько файлов одновременно
// Отправьте XML-документ на веб-сервер
вар xmlhttp = новый ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// Отображение информации, возвращаемой сервером
div_message.innerHTML = xmlhttp.ResponseText;
}
</СКРИПТ>
на стороне сервера
использует тот же объект для обеспечения функций обработки загрузки на стороне сервера.
<%@ LANGUAGE=VBScript%>
<% Опция явная
Response.Expires = 0
'Определение переменных и объектов.
тусклый ado_stream
dimxml_dom
dim xml_file1
'Создать объект потока
установите ado_stream = Server.CreateObject("ADODB.Stream")
' Создаем объект XMLDOM из объекта Request
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load (запрос)
'Чтение узлов, содержащих двоичные данные
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Открываем объект Stream и сохраняем в нем данные
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
'Сохранить файл
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
'Уничтожить объект
установить ado_stream = Ничего
установить xml_dom = Ничего
'Возвращаем информацию в браузер
Ответ. Напишите «Загрузка прошла успешно!»
%>
Вы также можете использовать объект Stream для помещения данных в поле BLOB базы данных.
Преимущество использования этого метода заключается в том, что
он не приводит к конверсии страниц.
Никаких специальных компонентов не требуется.
Одновременно можно загрузить несколько файлов.
Эта программа написана на чистом скрипте и может быть легко вставлена в другие коды без использования каких-либо объектов HTML. Эту логику также можно реализовать на любом языке, поддерживающем стандарт COM.
Соображения безопасности системы.
Этот метод можно использовать только во внутренних сетях, поскольку для него требуется, чтобы уровень безопасности IE5 был установлен на «низкий». Обязательно:
Разрешить сценарии и объекты ActiveX. Этот параметр позволяет браузеру выполнять операторы JScript, например «myobj = new activexobject(...)»;
Междоменный доступ к источнику данных должен быть разрешен. Этот параметр позволяет использовать объекты Stream на стороне клиента. MS XML DOM 3.0 и MDAC 2.5 также должны быть установлены как на сервере, так и на клиенте.