Автор: Чжуй Фэн
уже давно использует ASP для написания веб-приложений. Вы неизбежно столкнетесь с различными проблемами. Среди них, вероятно, самая распространенная проблема, особенно с загрузкой изображений. , если вы хотите реализовать функцию «одна звезда в день», аналогичную той, что предоставляется виртуальным сообществом NetEase в вашем собственном сообществе, вы должны предоставить пользователям сети функцию загрузки фотографий. Для загрузки файлов изображений на сервер вы можете использовать различные бесплатные компоненты загрузки файлов. Хотя они очень мощные, во многих случаях мы можем использовать только бесплатное пространство, поддерживаемое ASP, или арендовать чужое виртуальное пространство. нам просто невозможно использовать компонент загрузки файлов; во втором случае нам также придется заплатить много «денег». Если у вас нет собственного виртуального хоста, вы можете легко установить на сервер необходимые компоненты. Эта ситуация недоступна для большинства людей. Тогда мы ничего не можем сделать? Ха-ха, ответ — да (конечно, да, иначе я бы не смог написать эту статью). Давайте на чистом ASP-коде реализуем функцию загрузки изображений и сохранения их в базу данных (кстати, мы также реализуем функцию отображения изображений в базе данных на веб-странице).
Во-первых, давайте познакомимся с методами объекта, которые мы будем использовать. Обычно мы используем объект Request для получения данных, переданных с предыдущей страницы. Аналогичным образом мы также можем использовать объект Request для получения данных загруженного файла. Используемый метод — Request.BinaryRead(). Метод, который мы используем для чтения данных изображения из базы данных и отображения их на веб-странице:
Запрос.БинариЗапись(). Когда мы получаем данные изображения и сохраняем их в базе данных, мы не можем напрямую использовать оператор Insert для управления базой данных. Вместо этого мы должны использовать метод AppendChunk ADO. Аналогично, для чтения данных изображения в базе данных мы должны использовать. Метод GetChunk. Конкретный синтаксис каждого метода следующий:
* Синтаксис Request.BinaryRead:
вариант = Request.BinaryRead (количество)
параметр
вариант
Возвращаемое значение содержит данные, считанные с клиента.
считать
Указывает объем данных, которые необходимо прочитать из клиента. Это значение меньше или равно объему данных, полученных с помощью метода Request.TotalBytes.
* Синтаксис Request.BinaryWrite:
Request.BinaryWritedata
параметр
данные
Пакет, который будет записан в браузер клиента.
* Синтаксис Request.TotalBytes:
вариант = Request.TotalBytes
параметр
вариант
Возвращает количество байтов данных, прочитанных от клиента.
* Синтаксис AppendChunk добавляет данные к большому текстовому, двоичному полю данных или объекту параметра.
объект.AppendChunkData
параметр
objectField или объект параметра
Тип варианта данных, содержащий данные, добавленные к объекту.
Описание Используйте метод AppendChunk объекта Поле или Параметр, чтобы заполнить объект длинными двоичными или символьными данными. Если системная память ограничена, вы можете использовать метод AppendChunk для выполнения некоторых, но не всех операций над длинными целочисленными значениями.
Синтаксис *GetChunk возвращает все или часть содержимого большого объекта поля текстовых или двоичных данных.
переменная = поле.GetChunk(Размер)
Возвращаемое значение возвращает тип варианта.
параметр
Размер длинного целочисленного выражения, равный количеству байтов или символов, которые необходимо получить.
Описание Используйте метод GetChunk объекта Field для получения некоторых или всех его длинных двоичных или символьных данных. Если системная память ограничена, вы можете использовать метод GetChunk для обработки некоторых, но не всех значений длинных целых чисел.
Данные, возвращаемые вызовом GetChunk, будут присвоены «переменной». Если Размер больше остальных данных, то
GetChunk просто возвращает оставшиеся данные, не заполняя «переменную» пробелами. Если поле пусто, то
Метод GetChunk возвращает значение Null.
Каждый последующий вызов GetChunk будет извлекать данные, начиная с того места, где остановился предыдущий вызов GetChunk. Однако если вы извлекаете данные из одного поля, а затем устанавливаете или читаете значение другого поля в текущей записи, ADO предположит, что данные были получены из первого поля. Если метод GetChunk вызывается снова для первого поля, ADO интерпретирует вызов как новую операцию GetChunk и начинает чтение с начала записи. Если другой объект Recordset не является копией первого объекта Recordset, доступ к полям в нем не нарушит операцию GetChunk.
Если бит adFldLong в свойстве Attributes объекта Field установлен в значение True, вы можете использовать метод GetChunk для этого поля.
Если при использовании метода Getchunk для объекта Field текущей записи нет, будет сгенерирована ошибка 3021 (Нет текущей записи).
Далее мы собираемся спроектировать нашу базу данных. В качестве теста структура нашей базы данных будет следующей (access2000):
Имя поля тип описания идентификатор автоматический номер значение первичного ключа
img OLE-объект используется для сохранения данных изображения.
Для MSSQLServer7 соответствующая структура выглядит следующим образом:
Имя поля тип описания id int (Identity) значение первичного ключа
img image используется для сохранения данных изображения
Теперь мы начинаем формально писать часть нашего чистого ASP-кода, предназначенную для загрузки. Во-первых, у нас есть интерфейс загрузки, предоставляемый пользователю, который позволяет пользователю выбрать изображение для загрузки. Код выглядит следующим образом (upload.htm):
<html>
<тело>
<центр>
<form name="mainForm" enctype="multipart/form-data" action="process.asp" метод=post>
<inputtype=filename=mefile><br>
<inputtype=submitname=okvalue="ОК">
</форма>
</центр>
</тело>
</html>
Обратите внимание, что enctype="multipart/form-data" должен иметь этот атрибут в форме, иначе загруженные данные не будут получены. Далее нам необходимо выполнить необходимую обработку данных, полученных из браузера в файлеprocess.asp, поскольку данные, которые мы получаем в файлеprocess.asp, содержат не только данные загруженных нами изображений, но и другую бесполезную информацию, которая нам нужна. для устранения избыточных данных и сохранения обработанных данных изображения в базе данных. В качестве примера мы возьмем access2000. Конкретный код выглядит следующим образом (process.asp):
<%
ответ.buffer=истина
formize=request.totalbytes
formdata=request.binaryread(размер формы)
bncrlf=chrB(13)&chrB(10)
делитель = leftB (formdata, clng (instrb (formdata, bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(formdata,datastart,dataend)
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
Rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3
запись.addnew
запись("img").appendchunkmydata
запись.обновление
запись.закрыть
setrec=ничего
setconnGraph = ничего
%>
Хорошо, теперь мы сохранили загруженные изображения в базу данных с именем images.mdb. Оставшаяся работа — отобразить данные изображения в базе данных на веб-странице. Обычно в HTML для отображения изображений используется тег <IMG>, то есть <IMGSRC="путь к изображению">, но наши изображения сохраняются в базе данных. Что такое «путь к изображению»? Ха-ха, на самом деле, помимо указания пути, этот атрибут SRC также можно использовать следующим образом:
<IMGSRC="showimg.asp?id=xxx">
Итак, все, что нам нужно сделать, это прочитать квалифицированные данные из базы данных в showimg.asp и вернуть их в атрибут SRC. Конкретный код выглядит следующим образом (showimg.asp):
<%
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
strsql="selectimgfromimageswhereid="&trim(request("id"))
Rec.openstrsql, connGraph, 1,1
Response.ContentType="изображение/*"
Response.BinaryWriterec("img").getChunk(7500000)
запись.закрыть
setrec=ничего
setconnGraph = ничего
%>
Обратите внимание, что Response.ContentType="image/*" необходимо указать перед выводом в браузер.
для нормального отображения изображения.
Последнее, что следует отметить, это то, что обработка в моем файлеprocess.asp не учитывает наличие других данных на первой странице (upload.htm), таких как <INPUT type=tesxt name=userid> и т. д., если есть эти элементы, ваш процесс.asp должен уделять внимание обработке ненужных данных.