In Bezug auf die Dekodierungsgeschwindigkeit ist Huajing 2.0 bereits sehr hoch, weist jedoch noch die folgenden zwei Probleme auf:
1. Verwenden Sie Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes), um alle Daten auf einmal zu lesen, und verwenden Sie RequestData =Data_5xsoft.Read, um alle Daten auf einmal abzurufen. Wenn die hochgeladenen Daten zu groß sind, schlägt der Upload fehl zu wenig Speicher. Dies sollte die segmentierte Lesemethode verwenden.
2. Beim Speichern von Daten müssen Sie diese zuerst von Data_5xsoft in einen temporären Stream kopieren. Beim Speichern einer großen Datei sind doppelt so viele Speicherressourcen erforderlich. Beim Testen im Standalone-Zustand kann festgestellt werden, dass sich die Speicherzeit erhöht stark mit der Dateigröße und überschreitet sogar die Upload- und Dekodierungszeit.
Die von mir geschriebene Klasse verwendet die Methode des Block-für-Block-Lesens während des Decodierungsprozesses (Hinweis: Die Größe des Blocks ist nicht proportional zur Geschwindigkeit. Einzelmaschinentests zeigen, dass 64-KByte-Blöcke viel schneller sind als 1-MB-Blöcke), um Problem 1 zu lösen . Gleichzeitig verwenden wir die Methode, gewöhnliche Daten in den Workflow zu schreiben und den Dateiinhalt direkt in den eigenen Stream zu schreiben, um Problem 2 zu lösen.
Der Code lautet wie folgt, die Verwendung ähnelt Huajing:
Server.ScriptTimeOut = 600
Class QuickUpload
Privates FForm, FFile, Upload_Stream, ConvertStream
Eigenschaft get Formular
setForm = FForm
Ende Eigentum
Eigenschaft Datei abrufen
setFile = FFile
Ende Eigentum
Private Sub Class_Initialize
Dimmen Sie iStart, iEnd, Grenze, 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
set ConvertStream = Server.CreateObject("adodb.stream")
ConvertStream.Mode =3
ConvertStream.Charset="GB2312"
Wenn Request.TotalBytes<1, dann Exit Sub
'dStart = CDbl(Zeit)
„Finde die erste Grenze.“
iStart = Search(Upload_Stream, ChrB(13)&ChrB(10), 1)
'Holen Sie sich die Grenzzeichenfolge
Grenze = subString(1, iStart-1, false)
„Wenn es nicht die Endgrenze ist, wird eine Schleife ausgeführt.“
do while StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
iStart = iStart+2
'Holen Sie sich den Informationsheader des Formularelements
tun, während wahr
iEnd = Search(Upload_Stream, ChrB(13)&ChrB(10), iStart)
'Informationskopf zerlegen
line = subString(iStart, iEnd-iStart, true)
„Position verschieben.“
iStart = iEnd+2
if Line="" then Exit do
pos = instr(line,::)
wenn pos>0 dann
wenn StrComp(left(Line,pos-1),"Content-Disposition",1)=0 dann
'Holen Sie sich den Namen des Formularelements
FieldName = ExtractValue(Line,pos+1,"name")
'Dateinamen abrufen
FileName = ExtractValue(Line,pos+1,"filename")
'Dateipfad löschen
FileName = Mid(FileName,InStrRev(FileName, "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 then
'Dateityp abrufen
ContentType = trim(mid(Line,pos+1))
Ende wenn
Ende wenn
Schleife
'Holen Sie sich den Inhalt des Formularelements
if FileName<>"" then
„Neuer Dateiinhalt
setze theFile = new FileInfo
theFile.Init Dateiname, Inhaltstyp
'Verschieben Sie den Inhalt des Dateistreams in den Dateistream
MoveData Upload_Stream, theFile.Stream, iStart
„Upload-Daten werden direkt in den Dateistream übertragen, was die Dateispeicherzeit verkürzen kann.“
iEnd = Search(theFile.Stream, Grenze, 1)
'Folgedaten in den Workflow verschieben
MoveData theFile.Stream, Upload_Stream, iEnd-2
'
FFile.add FieldName, theFile
„Position verschieben.“
iStart = iStart+2+LenB(Grenze)
anders
„Grenzen finden.“
iEnd = Search(Upload_Stream, Grenze, iStart)
'Holen Sie sich den Inhalt des Formularelements
ItemValue = subString(iStart, iEnd-2-iStart, true)
'
if FForm.Exists(FieldName) dann
FForm.Item(FieldName) = FForm.Item(FieldName) & "," & ItemValue
anders
FForm.Add FieldName, ItemValue
Ende wenn
„Position verschieben.“
iStart = iEnd+LenB(Grenze)
Ende wenn
Schleife
'Response.Write "parse time:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
End Sub
Private Function Search(src, str, theStart)
iStart = theStart
pos=0
tun, während pos=0
„Die Länge ist nicht lang genug, lesen Sie ein Stück.“
Wenn src.Size<(iStart+lenb(str)-1) dann ReadChunk src
„Erhalten Sie Daten von etwa 64 KB, was den Speicherbedarf reduzieren kann.“
src.Position = iStart-1
buf = src.Read
„Grenzen erkennen.“
pos=InStrB(buf,str)
„Wenn nicht gefunden, gehen Sie zurück.“
wenn pos=0 dann iStart = iStart+LenB(buf)-LenB(str)+1
Schleife
Suche = iStart+pos-1
Funktion beenden
private sub MoveData(Src, Dest, theStart)
Src.Position = theStart-1
Zielposition = Zielgröße
Src.CopyTo dest
Src.Position = theStart-1
Src.SetEOS
Ende sub
private Funktion ExtractValue(line,pos,name)
dim t, p
ExtractValue = ""
t = Name + "="""
p = instr(pos,line,t)
wenn p>0 dann
n1 = p+len(t)
n2 = instr(n1,line,"""")
Wenn n2>n1, dann ExtractValue = mid(line,n1,n2-n1)
Ende wenn
Endfunktion
Private Funktion subString(theStart,theLen, ConvertToUnicode)
wenn theLen>0 dann
„Wenn die Länge nicht ausreicht, lesen Sie ein Datenelement.“
Wenn Upload_Stream.Size<theStart+theLen-1, dann ReadChunk Upload_Stream
Upload_Stream.Position=theStart-1
Binär =Upload_Stream.Read(theLen)
wenn ConvertToUnicode dann
ConvertStream.Type = 1
ConvertStream.Open
ConvertStream.Write Binary
ConvertStream.Position = 0
ConvertStream.Type = 2
subString = ConvertStream.ReadText
ConvertStream.Close
anders
subString = midB(Binär,1)
Ende wenn
anders
subString = ""
Ende wenn
Funktion beenden
Private Sub ReadChunk(src)
„Lesen Sie einen Block. Indem Sie jeweils 64 KB lesen, können Sie einen Speicherüberlauf verhindern, wenn die Datenmenge zu groß ist.“
Wenn Response.IsClientConnected = false, dann wird „Netzwerkverbindung unterbrochen“ ausgelöst.
BytesRead = 65536
src.Position = src.Size
src.Write Request.BinaryRead(BytesRead)
Sub beenden
'Ausnahmeinformationen
Private Sub-Raise (Nachricht)
Err.Raise vbObjectError, „QuickUpload“, Meldung
End Sub
Private Sub Class_Terminate
form.RemoveAll
file.RemoveAll
setze form=nichts
setze file=nichts
Upload_Stream.close
setze Upload_Stream=nothing
ConvertStream.Close
setConvertStream=nichts
End Sub
End Class
Class FileInfo
Privat FFileName, FFileType, FFileStart, FFileSize, FStream
Eigenschaft erhält Dateinamen
FileName = FFileName
Ende Eigentum
Eigenschaft erhält FileType
FileType = FFileType
Ende Eigentum
Eigenschaft erhält FileSize
FileSize = FStream.Size
Ende Eigentum
Eigenschaft getStream
setStream = FStream
Ende Eigentum
Öffentliche Unterinitialisierung (AFileName, AFileType)
FFileName = AFileName
FFileType = AFileType
Sub beenden
Öffentliche Funktion SaveAs(FullPath)
dim dr,ErrorChar,i
'dStart = CDbl(Zeit)
Speichern unter = 1
Wenn trim(fullpath)="" oder right(fullpath,1)="/" dann Funktion beenden
Bei Fehler Weiter fortsetzen
FStream.SaveToFile FullPath,2
wenn Err.Number>0 dann Response.Write „Fehler beim Speichern der Daten:“ & Err.Description & „<br>“
Speichern unter = 0
'Response.Write "save time:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
Endfunktion
Private Sub Class_Initialize
set FStream=CreateObject("Adodb.Stream")
FStream.mode=3
FStream.type=1
FStream.open
Ende sub
Private Unterklasse_Terminate
FStream.Close
setze FStream=nichts
Ende sub
Unterricht beenden