En termes de vitesse de décodage, Huajing 2.0 est déjà très élevée. Cependant, il présente encore les deux problèmes suivants :
1. Utilisez Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) pour lire toutes les données en même temps et utilisez RequestData =Data_5xsoft.Read pour obtenir toutes les données en même temps. Lorsque les données téléchargées sont trop volumineuses, le téléchargement échouera. à une mémoire insuffisante. Cela devrait être Utiliser la méthode de lecture segmentée.
2. Lors de la sauvegarde des données, vous devez d'abord les copier de Data_5xsoft vers un flux temporaire. Lors de la sauvegarde d'un fichier volumineux, deux fois plus de ressources de stockage sont nécessaires. Lorsqu'il est testé dans un état autonome, on peut constater que le temps de sauvegarde augmente. fortement avec la taille du fichier, dépassant même le temps de téléchargement et le temps de décodage.
La classe que j'ai écrite utilise la méthode de lecture bloc par bloc pendant le processus de décodage (remarque : la taille du bloc n'est pas proportionnelle à la vitesse. Les tests sur une seule machine montrent que les blocs de 64 Ko sont beaucoup plus rapides que les blocs de 1 M) pour résoudre le problème 1. , et en même temps, nous utilisons la méthode d'écriture de données ordinaires dans le flux de travail ; et d'écriture du contenu du fichier directement dans le propre flux du fichier pour résoudre le problème 2.
Le code est le suivant, l'utilisation est similaire à Huajing :
Server.ScriptTimeOut = 600
Class QuickUpload
FForm privé, FFile, Upload_Stream, ConvertStream
formulaire d'obtention de propriété
setForm = FForm
propriété finale
propriété obtenir un fichier
setFile = FFichier
propriété finale
Sous-classe privée_Initialize
dim iStart, iEnd, border, FieldName, FileName, ContentType, ItemValue, theFile, LineEnd
set FForm=CreateObject("Scripting.Dictionary")
set FFile=CreateObject("Scripting.Dictionary")
définir Upload_Stream=CreateObject("Adodb.Stream")
Upload_Stream.mode=3
Upload_Stream.type=1
Upload_Stream.open
définir ConvertStream = Server.CreateObject("adodb.stream")
ConvertStream.Mode =3
ConvertStream.Charset="GB2312"
si Request.TotalBytes <1 alors quittez le sous
'dDébut = CDbl(Heure)
'Trouvez la première limite
iStart = Recherche (Upload_Stream, ChrB (13)&ChrB (10), 1)
'Obtenir la chaîne de limite
limite = subString(1, iStart-1, false)
'Si ce n'est pas la limite finale, alors elle fera une boucle
faire pendant que StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
iDébut = iDébut+2
'Obtenir l'en-tête des informations sur l'élément de formulaire
faire tant que c'est vrai
iEnd = Recherche (Upload_Stream, ChrB(13)&ChrB(10), iStart)
'Décomposer l'en-tête des informations
ligne = sous-Chaîne (iStart, iEnd-iStart, true)
'Déplacer la position
iDébut = iFin+2
si Line="" alors Quitter faire
pos = instr(ligne,":")
si pos>0 alors
si StrComp(left(Line,pos-1),"Content-Disposition",1)=0 alors
'Obtenir le nom de l'élément du formulaire
FieldName = ExtractValue(Ligne,pos+1,"nom")
'Obtenir le nom du fichier
NomFichier = ExtractValue(Ligne,pos+1,"nomfichier")
'Supprimer le chemin du fichier
NomFichier = Milieu(NomFichier,InStrRev(NomFichier, "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 alors
'Obtenir le type de fichier
ContentType = trim(mid(Ligne,pos+1))
finir si
finir si
boucle
'Obtenir le contenu de l'élément de formulaire
si NomFichier<>"" alors
'Nouveau contenu du fichier
définir theFile = nouveau FileInfo
theFile.Init NomFichier, ContentType
'Déplacer le contenu du flux de fichiers vers le flux de fichiers
MoveData Upload_Stream, theFile.Stream, iStart
« Les données téléchargées sont directement transférées vers le flux de fichiers, ce qui peut réduire le temps de stockage des fichiers.
iEnd = Recherche (theFile.Stream, limite, 1)
'Déplacer les données ultérieures dans le flux de travail
MoveData theFile.Stream, Upload_Stream, iEnd-2
'
FFile.ajouter FieldName, theFile
'Déplacer la position
iDébut = iDébut+2+LenB(limite)
autre
'Trouver des limites
iEnd = Recherche (Upload_Stream, limite, iStart)
'Obtenir le contenu de l'élément de formulaire
ItemValue = sous-chaîne (iStart, iEnd-2-iStart, true)
'
si FForm.Exists(FieldName) alors
FForm.Item(FieldName) = FForm.Item(FieldName) & "," & ItemValue
autre
FForm.Add FieldName, ItemValue
finir si
'Déplacer la position
iDébut = iFin+LenB(limite)
finir si
boucle
'Response.Write "parse time:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
Fin de
la recherche de fonction sous-privée (src, str, theStart)
iStart = leDébut
pos=0
faire pendant que pos=0
'La longueur n'est pas assez longue, lis un morceau
si src.Size<(iStart+lenb(str)-1) alors ReadChunk src
"Obtenez une donnée d'environ 64 Ko, ce qui peut réduire les besoins en mémoire
src.Position = iStart-1
buf = src.Lire
'Détecter les limites
pos=InStrB(buf,str)
'Si vous ne le trouvez pas, reculez
si pos=0 alors iStart = iStart+LenB(buf)-LenB(str)+1
boucle
Recherche = iStart+pos-1
Fin de fonction
sous privé MoveData (Src, Dest, theStart)
Src.Position = theStart-1
Dest.Position = Dest.Taille
Src.CopyTo dest
Src.Position = theStart-1
Src.SetEOS
fin du sous
fonction privée ExtractValue (ligne, pos, nom)
faible t, p
ExtraireValeur = ""
t = nom + "="""
p = instr(pos,ligne,t)
si p>0 alors
n1 = p+len(t)
n2 = instr(n1,ligne,"""")
si n2>n1 alors ExtractValue = mid(line,n1,n2-n1)
finir si
fonction de fin
Sous-chaîne de fonction privée (theStart, theLen, ConvertToUnicode)
si laLen>0 alors
"Lorsque la longueur n'est pas suffisante, lisez une donnée
si Upload_Stream.Size<theStart+theLen-1 alors ReadChunk Upload_Stream
Upload_Stream.Position=theStart-1
Binaire =Upload_Stream.Read(theLen)
si ConvertToUnicode alors
ConvertStream.Type = 1
ConvertStream.Open
ConvertStream.Write binaire
ConvertStream.Position = 0
ConvertStream.Type = 2
sous-Chaîne = ConvertStream.ReadText
ConvertStream.Fermer
autre
sous-Chaîne = midB (Binaire,1)
finir si
autre
sous-Chaîne = ""
finir si
Fin de fonction
Sous-ReadChunk privé (src)
'Lire un bloc, en lisant 64 Ko à la fois, vous pouvez éviter un débordement de mémoire lorsque la quantité de données est trop importante
si Response.IsClientConnected = false alors augmentez "Connexion réseau interrompue"
OctetsLecture = 65536
src.Position = src.Taille
src.Write Request.BinaryRead (BytesRead)
Fin du sous-marin
'Informations sur les exceptions
Sous-augmentation privée (message)
Err.Raise vbObjectError, "QuickUpload", Message
Fin de la
sous-classe privée_Terminate
formulaire.RemoveAll
fichier.RemoveAll
définir le formulaire = rien
définir le fichier = rien
Upload_Stream.close
définir Upload_Stream=rien
ConvertStream.Fermer
setConvertStream = rien
End Sub
End Class
Classe FileInfo
FFileName privé, FFileType, FFileStart, FFileSize, FStream
propriété obtenir FileName
NomFichier = FFichierName
propriété finale
propriété obtenir FileType
Type de fichier = FFileType
propriété finale
propriété obtenir FileSize
TailleFichier = FStream.Taille
propriété finale
propriété getStream
setStream = FStream
propriété finale
Sous-initialisation publique (AFileName, AFileType)
FFileName = AFileName
FFileType = AFileType
Fin du sous-marin
Fonction publique SaveAs (FullPath)
dim dr, ErrorChar, je
'dDébut = CDbl(Heure)
Enregistrer sous = 1
si trim(fullpath)="" ou right(fullpath,1)="/" alors quittez la fonction
En cas d'erreur, reprendre ensuite
FStream.SaveToFile Chemin complet,2
si Err.Number>0 alors Response.Write "Erreur lors de l'enregistrement des données :" & Err.Description & "<br>"
Enregistrer sous = 0
'Response.Write "gagner du temps :" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
fonction de fin
Sous-classe privée_Initialize
set FStream=CreateObject("Adodb.Stream")
FStream.mode=3
FStream.type=1
FStream.open
fin du sous
Sous-classe privée_Terminate
FStream.Fermer
définir FStream = rien
fin du sous
Fin du cours