En términos de velocidad de decodificación, Huajing 2.0 ya es muy alta. Sin embargo, todavía tiene los dos problemas siguientes:
1. Utilice Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) para leer todos los datos a la vez y utilice RequestData =Data_5xsoft.Read para obtener todos los datos a la vez. Cuando los datos cargados son demasiado grandes, la carga fallará. a memoria insuficiente. Esto debería ser Utilice el método de lectura segmentada.
2. Al guardar datos, primero debe copiarlos de Data_5xsoft a una secuencia temporal. Al guardar un archivo grande, se requieren el doble de recursos de almacenamiento. Cuando se prueba en un estado independiente, se puede encontrar que el tiempo de ahorro aumenta. marcadamente con el tamaño del archivo, superando incluso el tiempo de carga y el tiempo de decodificación.
La clase que escribí utiliza el método de leer bloque por bloque durante el proceso de decodificación (nota: el tamaño del bloque no es proporcional a la velocidad. Las pruebas en una sola máquina muestran que los bloques de 64K son mucho más rápidos que los bloques de 1M) para resolver el problema 1 , Y al mismo tiempo, utilizamos el método de escribir datos ordinarios en el flujo de trabajo y escribir el contenido del archivo directamente en la propia secuencia del archivo para resolver el problema 2.
El código es el siguiente, el uso es similar al de Huajing:
Server.ScriptTimeOut = 600
Class QuickUpload
FForm privado, FFile, Upload_Stream, ConvertStream
formulario de obtención de propiedad
setForm = FForm
propiedad final
propiedad obtener archivo
setFile = FFile
propiedad final
Subclase privada_Inicializar
tenue iStart, iEnd, límite, nombre de campo, nombre de archivo, tipo de contenido, valor de elemento, archivo, fin de línea
establecer FForm=CreateObject("Scripting.Dictionary")
establecer FFile=CreateObject("Scripting.Dictionary")
establecer Upload_Stream=CreateObject("Adodb.Stream")
Upload_Stream.mode=3
Upload_Stream.tipo=1
Upload_Stream.abierto
establecer ConvertStream = Server.CreateObject("adodb.stream")
ConvertStream.Modo =3
ConvertStream.Charset="GB2312"
si Request.TotalBytes<1 entonces salga de Sub
'dInicio = CDbl(Tiempo)
'Encuentra el primer límite
iInicio = Buscar(Upload_Stream, ChrB(13)&ChrB(10), 1)
'Obtener la cadena límite
límite = subCadena(1, iStart-1, falso)
'Si no es el límite final, entonces se repetirá
hacer mientras StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
iInicio = iInicio+2
'Obtener el encabezado de información del elemento del formulario
hacer mientras sea cierto
iEnd = Buscar(Upload_Stream, ChrB(13)&ChrB(10), iStart)
'Descomponer encabezado de información
línea = subCadena(iStart, iEnd-iStart, verdadero)
'Mover posición
iInicio = iFin+2
si Line="" entonces Salir
pos = instr(línea,":")
si pos>0 entonces
si StrComp(left(Line,pos-1),"Content-Disposition",1)=0 entonces
'Obtener el nombre del elemento del formulario
NombreDeCampo = ExtraerValor(Línea,pos+1,"nombre")
'Obtener nombre de archivo
Nombre de archivo = ExtractValue(Línea,pos+1,"nombre de archivo")
'Eliminar ruta del archivo
Nombre de archivo = Mid(Nombre de archivo,InStrRev(Nombre de archivo, "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 entonces
'Obtener tipo de archivo
Tipo de contenido = recortar(mid(Line,pos+1))
terminar si
terminar si
bucle
'Obtener el contenido del elemento del formulario
si NombreDeArchivo<>"" entonces
'Nuevo contenido del archivo
establecer el archivo = nueva información del archivo
theFile.Init Nombre de archivo, Tipo de contenido
'Mover el contenido de la secuencia de archivos a la secuencia de archivos
MoveData Upload_Stream, theFile.Stream, iStart
'Los datos cargados se transfieren directamente al flujo de archivos, lo que puede reducir el tiempo de almacenamiento de archivos
iEnd = Buscar(theFile.Stream, límite, 1)
'Mover datos posteriores al flujo de trabajo
MoveData theFile.Stream, Upload_Stream, iEnd-2
'
FFile.agregar nombre de campo, el archivo
'Mover posición
iInicio = iInicio+2+LenB(límite)
demás
'Encontrar límites
iEnd = Buscar (Upload_Stream, límite, iStart)
'Obtener el contenido del elemento del formulario
ItemValue = subString(iStart, iEnd-2-iStart, verdadero)
'
si FForm.Exists (nombre de campo) entonces
FForm.Item(Nombre del campo) = FForm.Item(Nombre del campo) & "," & ItemValue
demás
FForm.Agregar nombre de campo, valor de artículo
terminar si
'Mover posición
iInicio = iEnd+LenB(límite)
terminar si
bucle
'Respuesta.Escribir "tiempo de análisis:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
Finalizar
búsqueda de función subprivada (src, str, theStart)
iInicio = elInicio
pos=0
hacer mientras pos=0
'La extensión no es lo suficientemente larga, lea una pieza
si src.Size<(iStart+lenb(str)-1) entonces ReadChunk src
'Obtenga un dato, de aproximadamente 64 K, que puede reducir los requisitos de memoria
src.Posición = iStart-1
buf = src.Leer
'Detectar límites
pos=InStrB(buf,cadena)
'Si no lo encuentra, retroceda
si pos=0 entonces iStart = iStart+LenB(buf)-LenB(str)+1
bucle
Buscar = iInicio+pos-1
Función final
sub privado MoveData (Src, Dest, theStart)
Src.Position = elInicio-1
Posición.Destino = Tamaño.Destino
Src.CopyTo destino
Src.Position = elInicio-1
Src.SetEOS
sub final
función privada ExtractValue (línea, pos, nombre)
tenue t, p
ExtraerValor = ""
t = nombre + "="""
p = instr(pos,línea,t)
si p>0 entonces
n1 = p+len(t)
n2 = instr(n1,línea,"""")
si n2>n1 entonces ExtractValue = mid(line,n1,n2-n1)
terminar si
función final
Subcadena de función privada (theStart, theLen, ConvertToUnicode)
si theLen>0 entonces
'Cuando la longitud no sea suficiente, lea un dato
si Upload_Stream.Size<theStart+theLen-1 entonces ReadChunk Upload_Stream
Upload_Stream.Position=elInicio-1
Binario =Upload_Stream.Read(theLen)
si ConvertToUnicode entonces
ConvertStream.Tipo = 1
ConvertStream.Open
ConvertStream.Write binario
ConvertStream.Posición = 0
ConvertStream.Tipo = 2
subString = ConvertStream.ReadText
ConvertStream.Cerrar
demás
subcadena = midB(Binario,1)
terminar si
demás
subcadena = ""
terminar si
Función final
SubReadChunk privado (src)
'Lea un bloque, al leer 64K a la vez, puede evitar el desbordamiento de la memoria cuando la cantidad de datos es demasiado grande
si Response.IsClientConnected = false entonces aparece "Conexión de red interrumpida"
Bytes leídos = 65536
src.Posición = src.Tamaño
src.Solicitud de escritura.BinaryRead(BytesRead)
Subtítulo final
'Información de excepción
Sub aumento privado (mensaje)
Err.Raise vbObjectError, "QuickUpload", Mensaje
Finalizar subclase
subprivada_Terminar
formulario.RemoveAll
archivo.RemoveAll
establecer formulario = nada
establecer archivo = nada
Upload_Stream.cerrar
establecer Upload_Stream=nada
ConvertStream.Cerrar
setConvertStream=nada
Fin Sub
Fin Clase Clase
Información de archivo
Nombre de archivo privado, tipo de archivo, inicio de archivo, tamaño de archivo, FStream
propiedad obtener nombre de archivo
Nombre de archivo = Nombre de archivo
propiedad final
propiedad obtener tipo de archivo
Tipo de archivo = tipo de archivo
propiedad final
propiedad obtener tamaño de archivo
Tamaño de archivo = FStream.Size
propiedad final
propiedad getStream
setStream = FStream
propiedad final
Subinicio público (AFileName, AFileType)
NombreDeArchivo = NombreDeArchivo
FFileType = AFileType
Subtítulo final
Función pública Guardar como (ruta completa)
dim dr,ErrorChar,yo
'dInicio = CDbl(Tiempo)
Guardar como=1
si trim(fullpath)="" o right(fullpath,1)="/" entonces salga de la función
En caso de error Continuar siguiente
FStream.SaveToFile Ruta completa,2
si Err.Number>0 entonces Response.Write "Error al guardar datos:" & Err.Description & "<br>"
Guardar como=0
'Respuesta.Escribir "ahorrar tiempo:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
función final
Subclase privada_Inicializar
establecer FStream=CreateObject("Adodb.Stream")
FStream.modo=3
FStream.tipo=1
Fstream.abierto
sub final
Subclase privada_Terminar
FStream.Cerrar
establecer FStream = nada
sub final
Fin de clase