Penulis: Zhui Feng
telah lama menggunakan ASP untuk menulis aplikasi website. Tidak dapat dipungkiri bahwa Anda akan menemui berbagai masalah. Diantaranya, cara mengupload file ke server mungkin merupakan masalah yang paling umum, terutama saat mengupload gambar , jika Anda ingin menerapkan fungsi "satu bintang per hari" serupa dengan yang disediakan oleh komunitas virtual NetEase di komunitas Anda sendiri, Anda harus menyediakan fungsi bagi netizen untuk mengunggah foto. Untuk mengunggah file gambar ke server, Anda dapat menggunakan berbagai komponen pengunggahan file gratis. Meskipun sangat kuat, dalam banyak kasus, kami hanya dapat menggunakan ruang gratis yang didukung ASP atau menyewa ruang virtual orang lain tidak mungkin bagi kami untuk menggunakan komponen pengunggahan file; sedangkan untuk kasus kedua, kami juga harus membayar banyak "uang". Kecuali Anda memiliki host virtual sendiri, Anda dapat dengan mudah menginstal komponen yang Anda perlukan di server. Situasi ini di luar jangkauan kebanyakan orang. Lalu tidak ada yang bisa kita lakukan? Haha jawabannya iya (tentu saja iya, kalau tidak saya tidak akan bisa menulis artikel ini). Mari kita gunakan kode ASP murni untuk mengimplementasikan fungsi mengunggah gambar dan menyimpannya ke database (omong-omong, kami juga mengimplementasikan fungsi menampilkan gambar dalam database di halaman web).
Pertama, mari kita kenali metode objek yang akan kita gunakan. Kami biasanya menggunakan objek Permintaan untuk mendapatkan data yang diteruskan dari halaman sebelumnya. Demikian pula kita juga bisa menggunakan objek Request untuk mendapatkan data file yang diupload. Metode yang digunakan adalah Request.BinaryRead(). Metode yang kami gunakan untuk membaca data gambar dari database dan menampilkannya di halaman web adalah:
Permintaan.BinaryWrite(). Ketika kita mendapatkan data gambar dan menyimpannya ke database, kita tidak bisa langsung menggunakan pernyataan Sisipkan untuk mengoperasikan database, kita harus menggunakan metode AppendChunk dari ADO metode GetChunk. Sintaks spesifik dari setiap metode adalah sebagai berikut:
*Sintaks Permintaan.BinaryRead:
varian=Permintaan.BinaryRead(hitungan)
parameter
variasi
Nilai yang dikembalikan menyimpan data yang dibaca dari klien.
menghitung
Menunjukkan jumlah data yang akan dibaca dari klien. Nilai ini kurang dari atau sama dengan jumlah data yang diperoleh menggunakan metode Request.TotalBytes.
*Sintaks Request.BinaryWrite:
Permintaan.BinaryWritedata
parameter
data
Paket yang akan ditulis ke browser klien.
*Sintaks Permintaan.TotalBytes:
varian=Permintaan.TotalBytes
parameter
variasi
Mengembalikan jumlah byte data yang dibaca dari klien.
*Sintaks AppendChunk menambahkan data ke teks besar, Bidang data biner, atau objek Parameter.
objek.AppendChunkData
parameter
objekField atau objek Parameter
Tipe varian data, berisi data yang ditambahkan ke objek.
Deskripsi Gunakan metode AppendChunk pada objek Bidang atau Parameter untuk mengisi data biner atau karakter panjang ke dalam objek. Ketika memori sistem terbatas, Anda dapat menggunakan metode AppendChunk untuk melakukan beberapa, tetapi tidak semua operasi pada nilai bilangan bulat yang panjang.
*Sintaks GetChunk mengembalikan seluruh atau sebagian konten objek Bidang teks besar atau data biner.
variabel=bidang.GetChunk(Ukuran)
Nilai yang dikembalikan mengembalikan tipe varian.
parameter
Ukuran ekspresi bilangan bulat panjang, sama dengan jumlah byte atau karakter yang akan diambil.
Deskripsi Gunakan metode GetChunk objek Bidang untuk mengambil beberapa atau semua data biner atau karakter panjangnya. Ketika memori sistem terbatas, Anda dapat menggunakan metode GetChunk untuk memproses beberapa tetapi tidak semua nilai bilangan bulat panjang.
Data yang dikembalikan oleh panggilan GetChunk akan ditugaskan ke "variabel". Jika Ukuran lebih besar dari data yang tersisa, maka
GetChunk hanya mengembalikan data yang tersisa tanpa mengisi "variabel" dengan kosong. Jika bidangnya kosong, maka
Metode GetChunk mengembalikan Null.
Setiap panggilan GetChunk berikutnya akan mengambil data mulai dari panggilan GetChunk sebelumnya. Namun, jika Anda mengambil data dari satu bidang dan kemudian mengatur atau membaca nilai bidang lain dalam rekaman saat ini, ADO akan berasumsi bahwa data telah diambil dari bidang pertama. Jika metode GetChunk dipanggil lagi pada kolom pertama, ADO akan menafsirkan panggilan tersebut sebagai operasi GetChunk baru dan mulai membaca dari awal rekaman. Jika objek Recordset lain bukan merupakan salinan dari objek Recordset pertama, mengakses field di dalamnya tidak akan merusak operasi GetChunk.
Jika bit adFldLong di properti Attributes objek Bidang diatur ke True, Anda dapat menggunakan metode GetChunk di lapangan.
Jika tidak ada catatan saat ini saat menggunakan metode Getchunk pada objek Bidang, kesalahan 3021 (Tidak Ada Catatan Saat Ini) akan dihasilkan.
Selanjutnya, kita akan mendesain database kita. Sebagai pengujian, struktur database kita adalah sebagai berikut (access2000):
Nama bidang jenis deskripsi id nomor otomatis nilai kunci utama
Objek img OLE digunakan untuk menyimpan data gambar
Untuk MSSQLServer7, struktur terkaitnya adalah sebagai berikut:
Nama bidang jenis deskripsi id int (Identitas) nilai kunci utama
Gambar img digunakan untuk menyimpan data gambar
Sekarang kita mulai secara formal menulis bagian unggahan dari kode ASP murni kita. Pertama, kita memiliki antarmuka unggahan yang disediakan untuk pengguna, yang memungkinkan pengguna memilih gambar yang akan diunggah. Kodenya adalah sebagai berikut (upload.htm):
<html>
<tubuh>
<tengah>
<form name="mainForm" enctype="multipart/form-data" action="process.asp" metode=post>
<inputtype=nama file=mefile><br>
<inputtype=submitname=okvalue="OK">
</bentuk>
</pusat>
</tubuh>
</html>
Perhatikan bahwa enctype="multipart/form-data" harus memiliki atribut ini di Formulir, jika tidak, data yang diunggah tidak akan diperoleh. Selanjutnya kita perlu melakukan pemrosesan yang diperlukan pada data yang diperoleh dari browser di process.asp, karena data yang kita peroleh di process.asp tidak hanya berisi data gambar yang kita inginkan, tetapi juga berisi informasi tidak berguna lainnya yang kita perlukan. untuk menghilangkan data yang berlebihan dan menyimpan data gambar yang diproses ke database. Di sini kita mengambil access2000 sebagai contoh. Kode spesifiknya adalah sebagai berikut (process.asp):
<%
respon.buffer=benar
formsize=permintaan.totalbytes
formdata=permintaan.binaryread(ukuran bentuk)
bncrlf=chrB(13)&chrB(10)
pembagi=kiriB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,pembagi)-datastart
mydata=midb(formdata,datamulai,dataakhir)
setconnGraph=server.CreateObject("ADODB.koneksi")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Buka
setrec=server.createobject("ADODB.recordset")
rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3
rec.addnew
rec("img").appendchunkmydata
rec.update
rec.close
setrec=tidak ada
setconnGraph=tidak ada
%>
Oke, sekarang kita sudah menyimpan gambar yang diupload ke dalam database bernama images.mdb. Pekerjaan selanjutnya adalah menampilkan data gambar dalam database di halaman web. Umumnya dalam HTML, tag <IMG> digunakan untuk menampilkan gambar, yaitu <IMGSRC="image path">, tetapi gambar kita disimpan di database. Haha, sebenarnya selain untuk menentukan path, atribut SRC ini juga bisa digunakan seperti ini:
<IMGSRC="showimg.asp?id=xxx">
Jadi yang harus kita lakukan hanyalah membaca data yang memenuhi syarat dari database di showimg.asp dan mengembalikannya ke atribut SRC. Kode spesifiknya adalah sebagai berikut (showimg.asp):
<%
setconnGraph=server.CreateObject("ADODB.koneksi")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
server.MapPath("gambar.mdb")&";uid=;PWD=;"
connGraph.Buka
setrec=server.createobject("ADODB.recordset")
strsql="selectimgfromimageswhereid="&trim(permintaan("id"))
rec.openstrsql,sambunganGraph,1,1
Respon.ContentType="gambar/*"
Respon.BinaryWriterec("img").getChunk(7500000)
rec.close
setrec=tidak ada
setconnGraph=tidak ada
%>
Perhatikan bahwa Response.ContentType="image/*" harus ditentukan sebelum menghasilkan output ke browser.
untuk menampilkan gambar secara normal.
Hal terakhir yang perlu diperhatikan adalah pemrosesan di process.asp saya tidak memperhitungkan adanya data lain di halaman pertama (upload.htm), seperti <INPUT type=tesxt name=userid>, dll, jika ada item ini, process.asp Anda harus memperhatikan pemrosesan data yang tidak perlu.