Компонент загрузки SWFUpload был первоначально разработан Vinterwebb.se. Основная часть компонента интегрирована с Flash и JavaScript. Он в основном предназначен для решения проблемы загрузки нескольких файлов и больших файлов. Компонент предоставляет множество событий и интерфейсов. для удобного вызова веб-разработчиками. Вы можете легко управлять стилем и добиваться желаемого эффекта загрузки с помощью js и css. Но, возможно, поскольку ASP постепенно уходит из веб-разработки, официальные лица предоставляют только программы обработки загрузки для .net, php и других версий. Разработчикам ASP приходится самостоятельно обрабатывать прием данных на стороне сервера.
Когда я впервые столкнулся с этим компонентом, меня привлекли его мощные функции, гибкость и удобство. Поскольку в то время проект разрабатывался с использованием ASP, Baidu после некоторых исследований обнаружил, что полезной программы обработки загрузки ASP (сейчас) не существует. их много^^), поэтому казалось, что я могу сделать это только сам. Исследования и разработки Изначально для перехвата файловых данных использовался метод обработки обычных загрузок. После нескольких испытаний выяснилось, что он не может эффективно получать. данные файла, передаваемые компонентом. , у меня не было другого выбора, кроме как начать анализировать формат отправленных им данных. В ходе анализа я обнаружил, что формат отправленных им данных все еще несколько отличался от обычных загрузок. И изображения, и файлы отправлялись на сервер в виде октетного потока. Форматирование данных понял, остальное перехватить. Поделюсь своим методом обработки с друзьями, которым он нужен. Скорость обработки вполне идеальна.
Скопируйте код кода следующим образом:
<%
Класс SWЗагрузить
Частная формаData,folderPath,streamGet
Частный fileSize, chunkSize, bofCont, eofCont
REM КЛАСС-ИНИЦИАЛИЗАЦИЯ
Частный подкласс_инициализировать
CallInitVariant
Сервер.ScriptTimeOut = 1800
УстановитеstreamGet = Server.CreateObject(ADODB.Stream)
sАвтор = 51JS.COM-ZMM
sVersion = Класс загрузки 1.0
Конец субтитра
REM КЛАСС-ИНИЦИАЛИЗАЦИЯ
Открытое свойство Let SaveFolder(byVal sFolder)
Если Право(sFolder, 1) = / Тогда
путь к папке = спапка
Еще
путь к папке = sFolder &/
Конец, если
Конечная собственность
Публичная собственность: Get SaveFolder
SaveFolder = Путь к папке
Конечная собственность
Частная функция InitVariant
размер чанка = 1024 * 128
путь к папке = /: размер файла = 1024 * 10
bofCont = StrToByte (поток октетов & vbCrlf & vbCrlf)
eofCont = StrToByte(vbCrlf & String(12, -))
Конечная функция
Открытая функция GetUploadData
Тусклый curRead: curRead = 0
Тусклый dataLen: dataLen = Request.TotalBytes
streamGet.Type = 1:streamGet.Open
Делать Пока curRead < dataLen
Тусклый partLen: partLen = chunkSize
Если partLen + curRead > dataLen Тогда partLen = dataLen - curRead
streamGet.Write Request.BinaryRead(partLen)
curRead = curRead + partLen
Петля
потокGet.Position = 0
formData =streamGet.Read(dataLen)
Вызов GetUploadFile
Конечная функция
Открытая функция GetUploadFile
Тусклый begMark : begMark = StrToByte(filename=)
Тусклый begPath: begPath = InStrB(1, formData, begMark & ChrB(34)) + 10
Тусклый endPath: endPath = InStrB(begPath, formData, ChrB(34))
Dim cntPath: cntPath = MidB (formData, begPath, endPath - begPath)
Тусклое имя cntName: cntName = путь к папке и GetClientName(cntPath)
Тусклый begFile: begFile = InStrB(1, formData, bofCont) + 15
Dim endFile: endFile = InStrB(begFile, formData, eofCont)
Вызов SaveUploadFile(cntName, begFile, endFile - begFile)
Конечная функция
Открытая функция SaveUploadFile(byVal fName, byVal bCont, byVal sLen)
Тусклый filePath: filePath = Server.MapPath(fName)
Если CreateFolder(|, GetParentFolder(filePath)) Тогда
потокGet.Position = bCont
УстановитеstreamPut = Server.CreateObject(ADODB.Stream)
streamPut.Type = 1:streamPut.Mode = 3:streamPut.Open
streamPut.WritestreamGet.Read(sLen)
streamPut.SaveToFile filePath, 2
streamPut.Close : УстановитьstreamPut = Ничего
Конец, если
Конечная функция
Частная функция IsNothing(byVal sVar)
IsNothing = IsNull(sVar) или (sVar = пусто)
Конечная функция
Частная функция StrToByte(byVal sText)
Для i = 1 To Len(sText)
StrToByte = StrToByte & ChrB(Asc(Mid(sText, i, 1)))
Следующий
Конечная функция
Частная функция ByteToStr(byVal sByte)
Тусклый потокTmp
УстановитеstreamTmp = Server.CreateObject(ADODB.Stream)
потокТмп.Тип = 2
потокTmp.Mode = 3
потокTmp.Open
потокTmp.WriteText сбайт
потокТмп.Позиция = 0
потокTmp.CharSet = utf-8
потокTmp.Position = 2
ByteToStr = потокTmp.ReadText
потокTmp.Close
Установить потокTmp = Ничего
Конечная функция
Частная функция GetClientName(byVal bInfo)
Dim sInfo, regEx
sInfo = ByteToStr(bInfo)
Если Ничего(sInfo) Тогда
ПолучитьИмяКлиента =
Еще
Установить регулярное выражение = Новое регулярное выражение
regEx.Pattern = ^.*//([^//]+)$
regEx.Global = Ложь
regEx.IgnoreCase = Истина
GetClientName = regEx.Replace(sInfo, $1)
Установить регулярное выражение = Ничего
Конец, если
Конечная функция
Частная функция GetParentFolder(byVal sPath)
Тусклое регулярное выражение
Установить регулярное выражение = Новое регулярное выражение
regEx.Pattern = ^(.*)//[^//]*$
regEx.Global = Истина
regEx.IgnoreCase = Истина
GetParentFolder = regEx.Replace(sPath, $1)
Установить регулярное выражение = Ничего
Конечная функция
Частная функция CreateFolder(byVal sLine, byVal sPath)
ФО
Установите oFso = Server.CreateObject(Scripting.FileSystemObject)
Если нет oFso.FolderExists(sPath), то
Тусклое регулярное выражение
Установить регулярное выражение = Новое регулярное выражение
regEx.Pattern = ^(.*)//([^//]*)$
regEx.Global = Ложь
regEx.IgnoreCase = Истина
sLine = sLine & regEx.Replace(sPath, $2) & |
sPath = regEx.Replace(sPath, $1)
Если CreateFolder(sLine, sPath) Тогда CreateFolder = True
Установить регулярное выражение = Ничего
Еще
Если сЛиния = | Тогда
СоздатьПапку = Истина
Еще
Dim sTemp : sTemp = Mid(sLine, 2, Len(sLine) - 2)
Если InStrRev(sTemp, |) = 0 Тогда
сЛайн = |
sPath = sPath &/& sTemp
Еще
Тусклая папка: Папка = Mid(sTemp, InStrRev(sTemp, |) + 1)
sLine = | & Mid(sTemp, 1, InStrRev(sTemp, |) - 1) & |
sPath = sPath &/& Папка
Конец, если
oFso.CreateFolder sPath
Если CreateFolder(sLine, sPath) Тогда CreateFolder = True
Конец, если
Конец, если
Установить oFso = Ничего
Конечная функция
REM КЛАСС-ПРЕКРАЩЕНИЕ
Частный подкласс_Terminate
потокGet.Close
Установить потокGet = Ничего
Конец субтитра
Конечный класс
Метод вызова REM
Dim oЗагрузить
Установить oUpload = Новый SWFUpload
oUpload.SaveFolder = путь к хранилищу
oUpload.GetUploadData
Установить oUpload = Ничего
%>