Что касается скорости декодирования, Huajing 2.0 уже очень высока. Однако у него все еще есть следующие две проблемы:
1. Используйте Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) для одновременного чтения всех данных и используйте RequestData =Data_5xsoft.Read для одновременного получения всех данных. Если загруженные данные слишком велики, загрузка не удастся. недостаточно памяти. Следует использовать метод сегментированного чтения.
2. При сохранении данных необходимо сначала скопировать их из Data_5xsoft во временный поток. При сохранении большого файла требуется вдвое больше ресурсов хранения. При тестировании в автономном состоянии можно обнаружить, что время сохранения увеличивается. резко с размером файла, даже превышающим время загрузки и время декодирования.
Класс, который я написал, использует метод чтения поблочно во время процесса декодирования (примечание: размер блока не пропорционален скорости. Тестирование на одной машине показывает, что блоки размером 64 КБ работают намного быстрее, чем блоки размером 1 М) для решения проблемы 1 ., и в то же время мы используем метод записи обычных данных в рабочий процесс и записи содержимого файла непосредственно в собственный поток файла для решения проблемы 2.
Код следующий, использование аналогично Huajing:
Server.ScriptTimeOut = 600
Class QuickUpload.
Частный FForm, FFile, Upload_Stream, ConvertStream
свойство получить форму
setForm = ФФорма
конечная собственность
свойство получить файл
setFile = FFile
конечная собственность
Частный подкласс_инициализировать
dim iStart, iEnd, граница, FieldName, FileName, ContentType, ItemValue, theFile, LineEnd
set FForm=CreateObject("Scripting.Dictionary")
set FFile=CreateObject("Scripting.Dictionary")
set Upload_Stream=CreateObject("Adodb.Stream")
Upload_Stream.mode=3
Upload_Stream.type=1
Upload_Stream.open
установите ConvertStream = Server.CreateObject("adodb.stream")
КонвертироватьПоток.Режим =3
ConvertStream.Charset="GB2312"
если Request.TotalBytes<1, то выйти из Sub
'dStart = CDbl(Время)
'Найди первую границу
iStart = Поиск(Upload_Stream, ChrB(13)&ChrB(10), 1)
'Получаем граничную строку
граница = subString(1, iStart-1, false)
'Если это не конечная граница, то она зациклится
делать, пока StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
iStart = iStart+2
'Получаем заголовок информации об элементе формы
делай, пока это правда
iEnd = Поиск(Upload_Stream, ChrB(13)&ChrB(10), iStart)
'Разложить информационный заголовок
линия = subString (iStart, iEnd-iStart, true)
'Переместить позицию
iНачало = iКонец+2
если Line="" то выход сделать
pos = instr(строка,":")
если поз>0, то
если StrComp(left(Line,pos-1),"Content-Disposition",1)=0, то
'Получаем имя элемента формы
ИмяПоля = ИзвлечьЗначение(Строка,поз+1,"имя")
'Получить имя файла
ИмяФайла = ExtractValue(Line,pos+1,"имя файла")
'Удалить путь к файлу
ИмяФайла = Mid(ИмяФайла,InStrRev(ИмяФайла, "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 тогда
'Получить тип файла
ContentType = Trim(mid(Line,pos+1))
конец, если
конец, если
петля
'Получаем содержимое элемента формы
если ИмяФайла<>"" тогда
'Новое содержимое файла
установите theFile = новый FileInfo
theFile.Init имя файла, тип контента
'Перемещаем содержимое файлового потока в файловый поток
MoveData Upload_Stream, theFile.Stream, iStart
«Данные загрузки передаются непосредственно в файловый поток, что может сократить время хранения файлов.
iEnd = Поиск(theFile.Stream, граница, 1)
'Переносим последующие данные в рабочий процесс
MoveData theFile.Stream, Upload_Stream, iEnd-2
'
FFile.add Имя поля, файл
'Переместить позицию
iStart = iStart+2+LenB(граница)
еще
«Найти границы
iEnd = Поиск (Upload_Stream, граница, iStart)
'Получаем содержимое элемента формы
ItemValue = subString(iStart, iEnd-2-iStart, true)
'
если FForm.Exists(FieldName), то
FForm.Item(FieldName) = FForm.Item(FieldName) & "," & ItemValue
еще
FForm.Добавить имя поля, ItemValue
конец, если
'Переместить позицию
iStart = iEnd+LenB(граница)
конец, если
петля
'Response.Write "время анализа:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
Конец
поиска субчастной функции (src, str, theStart)
iStart = Начало
позиция=0
делать, пока pos=0
«Длина недостаточно длинная, читайте один кусок»
если src.Size<(iStart+lenb(str)-1), то ReadChunk src
«Получите фрагмент данных размером около 64 КБ, который может снизить требования к памяти.
src.Position = iStart-1
buf = источник.Чтение
«Обнаружение границ
pos=InStrB(buf,str)
'Если не найден, двигаться назад
если pos=0, то iStart = iStart+LenB(buf)-LenB(str)+1
петля
Поиск = iStart+pos-1
Конечная функция
частный подменю MoveData(Src, Dest, theStart)
Исходная позиция = Начало-1
Конечная позиция = Конечный размер
Место назначения Src.CopyTo
Исходная позиция = Начало-1
ИсточникSetEOS
конец субтитра
частная функция ExtractValue(line,pos,name)
дим т, п
ИзвлечьЗначение = ""
т = имя + "="""
p = instr(pos,line,t)
если р>0, то
n1 = p+len(т)
n2 = instr(n1,line,"""")
если n2>n1, то ExtractValue = middle(line,n1,n2-n1)
конец, если
конечная функция
Частная функция subString(theStart,theLen, ConvertToUnicode)
если theLen>0, то
'Когда длины недостаточно, читаем фрагмент данных
если Upload_Stream.Size<theStart+theLen-1, то ReadChunk Upload_Stream
Upload_Stream.Position=theStart-1
Двоичный =Upload_Stream.Read(theLen)
если ConvertToUnicode, то
ConvertStream.Type = 1
КонвертироватьStream.Open
ConvertStream.Write двоичный файл
ConvertStream.Position = 0
ConvertStream.Type = 2
подстрока = ConvertStream.ReadText
ConvertStream.Close
еще
подстрока = MidB (двоичный, 1)
конец, если
еще
подстрока = ""
конец, если
Конечная функция
Частный дополнительный ReadChunk(src)
'Прочитайте блок, читая 64 КБ за раз, вы можете предотвратить переполнение памяти, когда объем данных слишком велик
если Response.IsClientConnected = false, то поднимите «Сетевое соединение прервано».
БайтЧтение = 65536
src.Position = src.Size
src.Запрос на запись.BinaryRead(BytesRead)
Конец субтитра
'Информация об исключении
Частное поднятие (сообщение)
Err.Raise vbObjectError, «QuickUpload», сообщение
Завершить подчастный
подкласс_Terminate
форма.RemoveAll
файл.RemoveAll
установить форму = ничего
установить файл = ничего
Upload_Stream.close
установить Upload_Stream=ничего
ConvertStream.Close
setConvertStream = ничего
Конец Sub
Конец класса
Class FileInfo
Частное FFileName, FFileType, FFileStart, FFileSize, FStream
свойство получить имя файла
ИмяФайла = FFИмяФайла
конечная собственность
свойство получить FileType
ТипФайла = FFТипФайла
конечная собственность
свойство получить FileSize
РазмерФайла = FStream.Size
конечная собственность
свойство getStream
setStream = FStream
конечная собственность
Публичный подзапуск (AFileName, AFileType)
FFИмя = AFИмя
ФФилетип = АФилетип
Конец субтитра
Открытая функция SaveAs(FullPath)
тусклый доктор,ErrorChar,я
'dStart = CDbl(Время)
СохранитьКак=1
если Trim(fullpath)="" или right(fullpath,1)="/" то выходим из функции
При ошибке Возобновить Далее
FStream.SaveToFile FullPath, 2
если Err.Number>0, то Response.Write «Ошибка сохранения данных:» & Err.Description & «<br>»
СохранитьКак=0
'Response.Write "экономить время:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
конечная функция
Частный подкласс_инициализировать
set FStream=CreateObject("Adodb.Stream")
FStream.mode=3
FStream.type=1
FStream.open
конец субтитра
Частный подкласс_Terminate
FStream.Close
установить FStream=ничего
конец субтитра
Конечный класс