<Действие формы=upload.asp метод=post enctype=multipart/form-data>
Загрузить файл:<Тип ввода=имя файла=file1><br>
<тип ввода=имя отправки=значение загрузки=загрузка>
</форма>
Среди них параметр enctype используется для установки метода кодирования MIME формы. При загрузке файла (или одновременного содержания текстового поля) для его атрибута должно быть установлено значение multipart/form-data. полученный двоичный файл на стороне сервера. Программа ASP для потоковой обработки будет представлена далее в этой статье.
2. Загрузите анализ формата файла.
Прежде чем обрабатывать файл, мы должны сначала понять конкретный формат загруженного файла. Мы можем просмотреть его двоичный код, написав следующую простую программу ASP:
<%
png=Request.TotalBytes 'Получить размер загруженного файла
filedata=Request.BinaryRead(filesize) 'Получить двоичные данные загруженного файла
Response.BinaryWrite filedata 'Отображение двоичных данных в браузере
%>
Анализируя двоичный код загруженного файла, отображаемый в браузере, мы обнаружили, что код состоит из четырех частей (если одновременно загружается несколько файлов или текстовых полей, коды располагаются в порядке загрузки и имеют одинаковый формат). ), и содержимое каждой части вводится с помощью возврата каретки. Разделяется символами новой строки:
1) Первая часть (стартовый флаг)
--------------------------7d329631b04d4
2) Часть 2 (Описание документа)
Content-Disposition: form-data; name=file1; filename=C:/Documents and Settings/Administrator/My Documents/Invitation.doc Content-Type: application/msword
Здесь мы можем получить имя файла и абсолютный путь к загруженному файлу, а также тип файла. Эта информация необходима для правильного сохранения файла.
3) Часть 3 (Содержание документа)
То есть двоичное содержимое файла опущено.
4) Часть 4 (отметка конца)
--------------------------7d329631b04d4
Объединив содержимое первой и четвертой частей, -----------------------------7d329631b04d4 (значение разное при каждой загрузке ) То же) действует как разделитель, который отмечает начало и конец фрагмента данных (при наличии нескольких загруженных материалов). Что касается информации, необходимой для сохранения файла, нам сначала нужно получить имя файла из имени файла второй части данных, затем нам нужно правильно определить начальную позицию файла и, наконец, использовать технологию ASP для сохранения. двоичный файл с исходным именем файла. Если одновременно загружается несколько материалов (например, несколько текстовых полей и файлов), они обрабатываются одинаково. Каждая часть содержимого включается в разделитель, но текстовые поля и файлы выражаются немного по-разному. Это можно сделать, специально проанализировав его двоичный код, чтобы понять.
3. Используйте технологию ASP для реализации хранилища файлов.
Обработка загруженного кода файла
1) Получите код разделителя
Из приведенного выше анализа мы уже знаем, что разделители играют важную роль в разделении нескольких сегментов данных (включая текстовые поля и различные типы файлов). Как было проанализировано ранее, разделитель появляется перед первым символом возврата каретки и перевода строки. Следовательно, код разделителя можно получить с помощью следующей программы:
<%
newline=chrB(13) & chrB(10) 'новая строка представляет двоичный символ возврата каретки
size=Request.TotalBytes 'filesize — размер загруженного файла.
filedata=Request.BinaryRead(filesize) 'filedata — это двоичные данные загруженного файла.
diver=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider — это разделитель
%>
Примечание. Поскольку здесь мы имеем дело с двоичным байт-кодом, все функции используют его двоичную версию с добавлением b.
2) Получите содержимое файла (или текстового поля)
(1) Подготовительная функция (преобразование двоичной строки в строку)
Содержимое загруженного файла не нуждается в преобразовании из двоичного формата в строковое и может быть сохранено напрямую. Однако если вам необходимо извлечь содержимое текстового поля или имя файла, необходимо выполнить преобразование. Поэтому необходимо написать универсальную функцию преобразования, подходящую для китайских иероглифов. Ниже приведен код функции:
Функция BtoS (bstr)
Если не является нулевым (bstr), то
для i = 0 до lenb(bstr) - 1
bchr = Midb(bstr,i+1,1)
If ascb(bchr)>127 Тогда 'Китайские иероглифы представляют собой двухбайтовые символы, поэтому два символа должны обрабатываться вместе
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
я = я+1
Еще
температура = температура&chr(ascb(bchr))
Конец, если
следующий
Конец, если
BtoS=температура
Конечная функция
(2) Получите содержимое файла (или текстового поля)
В реальных веб-приложениях операция загрузки может включать в себя множественное содержимое, например несколько текстовых полей, несколько файлов и т. д. Файлы и текстовые поля легко отличить. Данные файла содержат строку filename=. Поэтому мы написали следующую общую функцию, которую можно использовать для извлечения как содержимого файла, так и содержимого текстового поля (требуется двоичное преобразование):
Функция getdata(byval data, byval dir, Final) 'данные представляют собой двоичную строку; разделитель представляет собой разделитель; окончательный элемент представляет конечную позицию данных;
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) 'Двоичное представление строки filename=
bncrlf=chrb(13)&chrb(10) 'Двоичный символ возврата каретки
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) 'Начальная позиция
endpos = instrb(startpos,data, делитель)-lenb(bncrlf) 'Конечная позиция
part1 = Midb(data, startpos, endpos-startpos) 'Содержимое между двумя разделителями
firstline = middleb(part1, 1, instrb(part1, bncrlf)-1) ' Абзац описания перед содержимым
If (instrb(firstline,filename)=0) then 'Если это текстовое поле, получить содержимое строки текстового поля
стемп=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata = BtoS (стемп)
Else 'Если это файл, получить двоичное содержимое файла
Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (part1)
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
Конец, если
Финал=конечная позиция
Конечная функция
Вы можете получить необходимое содержимое файла (или текстового поля), вызвав эту функцию непосредственно в программе, как показано ниже:
<%
Content=getdata (данные, разделитель, позиция)
%>
3) Получить имя файла
Как было проанализировано ранее, поле filename= потока данных загружаемого файла содержит имя и абсолютный путь к файлу. Вообще говоря, нам нужно только извлечь имя файла из пути. Ниже приведен код программы:
<%
namepos=instrrev(B2S(firstline),chr(92)) 'первая строка — это данные части описания, полученные выше, chr(92)
выражать/
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) 'Получить имя файла
%>
Используйте ASP для непосредственной реализации функции загрузки файлов.
Традиционные программисты ASP могут использовать объект FILESYSTEMOBJECT только для перемещения, копирования, удаления и других операций с текстовыми файлами (.txt). Если им необходимо обрабатывать двоичные объекты, им приходится использовать методы, представленные ранее в этой статье. Однако теперь объект ADO.STREAM в ASP может одновременно работать с текстовыми и двоичными объектами (можно загрузить по адресу http://www.microsoft.com/data), и вы можете использовать его для непосредственной реализации загрузки файлов. функция в ASP. Ниже мы представляем процесс его реализации.
1) Откройте объект ПОТОК.
Для объектов SREAM, если вы хотите сохранить файл, вы должны сохранить все содержимое объекта. Следовательно, мы должны создать два (или более) объекта STREAM, один из которых является потоком исходных данных, который получает исходные двоичные данные, другой — потоком данных назначения, который получает обработанные данные из потока исходных данных, и, наконец, сохранить в нужный файл.
<%
set str=server.CreateObject(ADODB.Stream) 'str — поток исходных данных
str.Mode=3 'Установить открытый режим, 3 доступен для чтения и записи
str.Type=1 'Установите тип данных, 1 — двоичные данные.
ул.Открытая
set desc=server.CreateObject(ADODB.Stream) 'desc — целевой поток данных
desc.Mode=3
Описание.Тип=1
описание.Открыть
%>
2) Копирование контента между объектами STEAM
В этой части вы должны найти начало файла в исходном потоке данных и найти длину содержимого файла, прежде чем вы сможете правильно скопировать файл в целевой поток данных и сохранить его. Программный код выглядит следующим образом:
<%
formdata=Request.BinaryRead(Request.TotalBytes) 'formdata — это весь загруженный контент
str.Write formdata ' Поток исходных данных назначения
str.position=count-lenb(result)-2 'позиция указывает на начало файла
str.copyto desc, lenb(filecotent) 'lenb(filecontent) представляет длину файла
desc.SaveToFile fullpath,2 'Сохраняем файл с путем и именем, указанными в полном пути.
%>
3) Закройте объект STEAM.
После завершения программирования объект STEAM должен быть закрыт и освобожден следующим образом:
<%
Описание Закрыть
Установить описание = ничего
ул. Закрыть
Установить STR=ничего
%>
Подвести итог
В этой статье представлен метод непосредственной реализации загрузки файлов с использованием ASP, который хорошо применяется в системе управления информацией, разработанной этим подразделением. Практика доказала, что этот метод проще и эффективнее некоторых традиционных способов загрузки файлов.