Dalam hal kecepatan decoding, Huajing 2.0 sudah sangat tinggi, namun masih memiliki dua masalah berikut:
1. Gunakan Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) untuk membaca semua data sekaligus, dan gunakan RequestData =Data_5xsoft.Read untuk mendapatkan semua data sekaligus. Jika data yang diunggah terlalu besar, maka unggahan akan gagal karena memori tidak mencukupi. Ini harus Gunakan metode membaca tersegmentasi.
2. Saat menyimpan data, Anda perlu menyalinnya dari Data_5xsoft ke aliran sementara terlebih dahulu. Saat menyimpan file besar, diperlukan dua kali sumber daya penyimpanan. Saat diuji dalam keadaan berdiri sendiri, dapat ditemukan bahwa waktu penghematan meningkat tajam dengan ukuran file, bahkan melebihi waktu upload dan waktu decoding.
Kelas yang saya tulis menggunakan metode membaca blok demi blok selama proses decoding (catatan: ukuran blok tidak sebanding dengan kecepatan. Pengujian mesin tunggal menunjukkan bahwa blok 64K jauh lebih cepat daripada blok 1M) untuk menyelesaikan masalah 1 ., dan pada saat yang sama, kami menggunakan metode menulis data biasa ke dalam alur kerja; dan menulis konten file langsung ke aliran file itu sendiri untuk menyelesaikan masalah 2.
Kodenya sebagai berikut, penggunaannya mirip dengan Huajing:
Server.ScriptTimeOut = 600
Class QuickUpload
FForm Pribadi, FFile, Upload_Stream, ConvertStream
properti dapatkan Formulir
setForm = FForm
properti akhir
properti dapatkan File
setFile = FFile
properti akhir
Sub Kelas Pribadi_Inisialisasi
redupkan iStart, iEnd, batas, FieldName, FileName, ContentType, ItemValue, theFile, LineEnd
set FForm=CreateObject("Scripting.Kamus")
set FFile=CreateObject("Scripting.Kamus")
setel Unggah_Stream=BuatObjek("Adodb.Stream")
Unggah_Stream.mode=3
Unggah_Stream.type=1
Unggah_Stream.buka
atur ConvertStream = Server.CreateObject("adodb.stream")
KonversiStream.Mode =3
KonversiStream.Charset="GB2312"
jika Request.TotalBytes<1 lalu Keluar dari Sub
'dMulai = CDbl(Waktu)
'Temukan batas pertama
iStart = Pencarian(Upload_Stream, ChrB(13)&ChrB(10), 1)
'Dapatkan tali batasnya
batas = subString(1, iStart-1, false)
'Jika itu bukan batas akhir, maka itu akan berputar
lakukan saat StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
iMulai = iMulai+2
'Dapatkan header informasi item formulir
lakukan selagi benar
iEnd = Pencarian(Upload_Stream, ChrB(13)&ChrB(10), iStart)
'Dekomposisi tajuk informasi
baris = subString(iStart, iEnd-iStart, benar)
'Pindah tempat
iMulai = akhir+2
jika Jalur = "" maka Keluar lakukan
pos = instr(baris,":")
jika pos>0 maka
jika StrComp(left(Line,pos-1),"Content-Disposition",1)=0 maka
'Dapatkan nama item formulir
FieldName = ExtractValue(Baris,pos+1,"nama")
'Dapatkan nama file
Nama File = ExtractValue(Baris,pos+1,"namafile")
'Hapus jalur file
Nama File = Tengah(NamaFile,InStrRev(NamaFile, "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 lalu
'Dapatkan jenis file
ContentType = trim(tengah(Garis,pos+1))
berakhir jika
berakhir jika
lingkaran
'Dapatkan konten item formulir
jika Nama File<>"" lalu
'Konten file baru
atur File = FileInfo baru
theFile.Init Nama File, Tipe Konten
'Pindahkan konten aliran file ke aliran file
MoveData Upload_Stream, File.Stream, iStart
'Data yang diunggah langsung ditransfer ke aliran file, yang dapat mengurangi waktu penyimpanan file
iEnd = Pencarian(File.Stream, batas, 1)
'Pindahkan data selanjutnya ke dalam alur kerja
PindahkanData File.Stream, Upload_Stream, iEnd-2
'
FFile.tambahkan Nama Bidang, File
'Pindah tempat
iStart = iStart+2+LenB(batas)
kalau tidak
'Temukan batasan
iEnd = Pencarian(Upload_Stream, batas, iStart)
'Dapatkan konten item formulir
ItemValue = subString(iStart, iEnd-2-iStart, benar)
'
jika FForm.Exists(FieldName) lalu
FForm.Item(Nama Bidang) = FForm.Item(Nama Bidang) & "," & Nilai Barang
kalau tidak
FForm.Tambahkan Nama Bidang, Nilai Barang
berakhir jika
'Pindah tempat
iStart = iEnd+LenB(batas)
berakhir jika
lingkaran
'Respon.Tulis "waktu parse:" & FormatNumber((CDbl(Waktu)-dStart)*24*60*60,-1,-1) & "<br>"
Akhiri
Pencarian Fungsi Sub Pribadi (src, str, theStart)
iStart = Mulai
pos=0
lakukan sementara pos=0
'Panjangnya kurang panjang, baca one piece
jika src.Size<(iStart+lenb(str)-1) maka ReadChunk src
'Dapatkan sepotong data, sekitar 64K, yang dapat mengurangi kebutuhan memori
src.Posisi = iStart-1
buf = src.Baca
'Deteksi batasan
pos=InStrB(buf,str)
'Jika tidak ditemukan, mundurlah
jika pos=0 maka iStart = iStart+LenB(buf)-LenB(str)+1
lingkaran
Pencarian = iStart+pos-1
Fungsi akhir
sub pribadi MoveData(Src, Dest, theStart)
Src.Position = Mulai-1
Posisi Tujuan = Ukuran Tujuan
Src.CopyKe tujuan
Src.Position = Mulai-1
Src.SetEOS
sub akhir
fungsi pribadi ExtractValue(baris,pos,nama)
redup t, hal
Nilai Ekstrak = ""
t = nama + "="""
p = instr(pos,garis,t)
jika p>0 maka
n1 = p+len(t)
n2 = instr(n1,baris,"""")
jika n2>n1 maka ExtractValue = pertengahan(baris,n1,n2-n1)
berakhir jika
fungsi akhir
SubString Fungsi Pribadi (theStart,theLen, ConvertToUnicode)
jika Len>0 maka
'Jika panjangnya tidak cukup, bacalah sepotong data
jika Upload_Stream.Size<theStart+theLen-1 lalu ReadChunk Upload_Stream
Upload_Stream.Position=Mulai-1
Biner =Upload_Stream.Read(theLen)
jika ConvertToUnicode maka
KonversiStream.Jenis = 1
KonversiStream.Buka
ConvertStream.Tulis Biner
KonversiStream.Posisi = 0
KonversiStream.Jenis = 2
subString = KonversiStream.ReadText
KonversiStream.Tutup
kalau tidak
subString = midB(Biner,1)
berakhir jika
kalau tidak
subString = ""
berakhir jika
Fungsi akhir
Sub ReadChunk Pribadi (src)
'Baca satu blok, dengan membaca 64K sekaligus, Anda dapat mencegah memori meluap ketika jumlah data terlalu besar
jika Response.IsClientConnected = false maka Naikkan "Koneksi jaringan terputus"
ByteBaca = 65536
src.Posisi = src.Ukuran
src.Permintaan Tulis.BinaryRead(BytesRead)
Akhiri Sub
'Informasi pengecualian
Sub Naikkan Pribadi (Pesan)
Err.Naikkan vbObjectError, "QuickUpload", Pesan
Akhiri Sub
Privat Sub Kelas_Terminate
form.RemoveAll
file.HapusSemua
atur formulir=tidak ada
atur file=tidak ada
Unggah_Stream.tutup
atur Upload_Stream=tidak ada
KonversiStream.Tutup
setConvertStream=tidak ada
Info File Kelas
Kelas Akhir
Sub Akhir
FFileName Pribadi, FFileType, FFileStart, FFileSize, FStream
properti dapatkan Nama File
Nama File = Nama File F
properti akhir
properti dapatkan FileType
Tipe File = FFileType
properti akhir
properti dapatkan FileSize
Ukuran File = FStream.Ukuran
properti akhir
properti getStream
setStream = FStream
properti akhir
Sub Init Publik (AFileName, AFileType)
FFileName = AFileName
FFileType = AFileType
Akhiri Sub
Fungsi publik SaveAs (FullPath)
redupkan dr,ErrorChar,i
'dMulai = CDbl(Waktu)
Simpan Sebagai=1
jika trim(fullpath)="" atau right(fullpath,1)="/" maka keluar dari fungsi
Pada Kesalahan Lanjutkan Berikutnya
FStream.SaveToFile Jalur Lengkap,2
jika Err.Number>0 maka Response.Tulis "Error saat menyimpan data:" & Err.Deskripsi & "<br>"
Simpan Sebagai=0
'Respon.Tulis "hemat waktu:" & FormatNumber((CDbl(Waktu)-dStart)*24*60*60,-1,-1) & "<br>"
fungsi akhir
Sub Kelas Pribadi_Inisialisasi
setel FStream=CreateObject("Adodb.Stream")
FStream.mode=3
FStream.type=1
FStream.terbuka
sub akhir
Sub Kelas Pribadi_Terminate
FStream.Tutup
atur FStream=tidak ada
sub akhir
Kelas Akhir