Ringkasan
Artikel ini menjelaskan contoh penggunaan teknologi XML untuk mengunggah file. Metode ini tidak memiliki keterbatasan dibandingkan metode tradisional. Contoh ini menjelaskan cara menggunakan MSXML3.0 dan objek ADO Stream untuk mengimplementasikan metode unggahan baru ini. Ada banyak manfaatnya, seperti tidak diperlukannya komponen upload khusus.
perkenalan
Untuk mendapatkan fungsi upload pada halaman web HTML, kita dapat menggunakan format FORM berikut pada klien:
<FORM NAME="myForm"
TINDAKAN="TargetURL.asp"
ENCTYPE="multibagian/form-data"
METODE="postingan">
<INPUT TYPE="file" NAMA="file saya">
<INPUT TYPE="kirim" VALUE="Unggah File">
</FORM>
Solusi ini memiliki banyak keterbatasan dalam penggunaan klien dan server. Pertama, kita harus menggunakan metode POST karena metode GET tidak dapat menangani data formulir tersebut. Selain itu, tidak ada cara untuk memicu tindakan POST tanpa menggunakan formulir. Setelah mengirimkan data ke pengendali formulir, browser akan memuat pengendali tersebut sebagai halaman baru, dan pengguna akan melihat transisi halaman yang tidak menyenangkan.
Atribut ENCTYPE mendefinisikan metode pengkodean MIME untuk formulir. Atribut ENCTYPE formulir untuk mengunggah file harus menggunakan "multipart/form-data". Menyetel atribut ini ke "multipart/form-data" akan membuat buffer POST (struktur komposit) yang berbeda dari struktur tradisional. Objek Permintaan ASP tidak dapat mengakses konten formulir tersebut. Jadi, kita bisa menggunakan metode Request.binaryRead untuk mengakses data ini, tapi kita tidak bisa melakukannya menggunakan bahasa scripting. Metode Request.binaryRead mengembalikan data tipe VTaray (array tipe Varian yang hanya berisi karakter satu byte yang tidak ditandatangani). Namun bahasa skrip hanya dapat menangani data Varian. Untuk mengatasi masalah ini, Anda hanya dapat menggunakan komponen pengunggahan ASP khusus, atau ekstensi ISAPI, seperti CPSHOST.DLL. Ini adalah batasan desain.
Rencana pengunggahan baru
perlu mengikuti langkah-langkah berikut.
Klien:
XML
untuk konten biner. Gunakan objek ADO Stream untuk memasukkan data file yang diunggah ke dalam node.
samping:
Baca dokumen XML dari objek Permintaan, baca data di node biner dan simpan dalam file di server. Tentu saja, kita juga bisa menyimpannya dalam field BLOB di database.
Sebelum menjelaskan kode ini, kami dapat memikirkan solusi ini.
Pemikiran tentang XML
Format XML mendukung banyak tipe data, seperti numerik, float, karakter, dll. Banyak penulis mendefinisikan XML sebagai format ASCII, namun kita tidak dapat mengabaikan bahwa teknologi XML juga dapat menggunakan tipe data "bin.base64" untuk mendeskripsikan informasi biner. Fitur ini didukung penuh di parser MS XML3.0, namun saat ini memerlukan beberapa pengaturan khusus. Objek ini menyediakan beberapa properti yang memungkinkan kontrol penuh atas data biner:
obj_node.dataType - Properti baca-tulis ini mendefinisikan tipe data dari node tertentu. Parser MSXML mendukung lebih banyak tipe data (lihat MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm )
Untuk data biner kita bisa menggunakan tipe "bin.base64".
obj_node.nodeTypedValue - Properti baca-tulis ini berisi data yang mewakili node tertentu dalam tipe yang ditentukan.
Kita dapat membuat dokumen XML yang berisi beberapa node tipe bin.base64, yang berisi file yang diunggah. Fitur ini memungkinkan Anda mengunggah banyak file sekaligus menggunakan satu POST.
Kita dapat menggunakan objek XMLHttpRequest dan metode POST untuk mengirim dokumen XML ke server Web. Objek ini memberikan dukungan protokol sisi klien ke server HTTP, memungkinkan objek MS XMLDOM dikirim dan diterima di server web. XMLHttpRequest adalah objek COM bawaan di Internet Explorer 5 (tidak diperlukan instalasi khusus), dan tidak perlu mengonversi halaman setelah pengiriman.
Berpikir tentang objek ADO Stream
Kita dapat membuat dokumen XML yang berisi satu atau lebih node biner di sisi klien. Kita juga harus mengisi node dengan isi file. Sayangnya, bahasa skrip tidak dapat mengakses sistem file lokal, dan objek Scripting.FileSystem (objek bawaan sistem Win32) sejauh ini belum dapat mengakses file biner. Ini adalah batasan desain. Jadi kita perlu mencari objek COM lain yang dapat memberikan akses ke biner lokal.
Objek ADO Stream (komponen dalam MDAC 2.5) menyediakan sarana untuk membaca, menulis, dan mengelola data aliran biner. Isi aliran byte dapat berupa teks atau data biner, dan tidak ada batasan kapasitas. Di ADO 2.5, pengenalan objek Stream oleh Microsoft tidak termasuk dalam lapisan mana pun dari struktur objek ADO, sehingga kita dapat menggunakan objek tersebut tanpa bundling.
Dalam artikel ini, objek Stream digunakan untuk mengakses konten file, dan kemudian konten tersebut disimpan dalam node XML.
di sisi klien
menggunakan objek Stream dan MSXML untuk menyelesaikan tindakan pengunggahan file.
<HTML>
<HEAD><TITLE>Pengiriman File</TITLE></HEAD>
<TUBUH>
<INPUT id=btn_send name="btn_send" type=button value="FILE SEND">
<DIV id=div_message>Siap</DIV>
</BODI>
</HTML>
<BAHASA SCRIPT=javascript>
// Fungsi unggah
fungsi btn_send.onclick()
{
//Buat objek aliran ADO
var ado_stream = new ActiveXObject("ADODB.Stream");
// Membuat dokumen XML yang berisi informasi header default dan node root
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml versi="1.0" ?> <root/>');
//Tentukan tipe data
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// Buat node baru dan atur sebagai node data biner
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
//Buka objek Stream dan baca file sumber
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Buka();
ado_stream.LoadFromFile("c:\tmp\filesaya.doc");
//Simpan konten file ke dalam node XML
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Tutup();
xml_dom.documentElement.appendChild(l_node1);
// Anda dapat membuat beberapa node biner dan mengunggah banyak file sekaligus
// Mengirim dokumen XML ke server Web
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST""./file_recieve.asp",false);
xmlhttp.kirim(xml_dom);
// Menampilkan informasi yang dikembalikan oleh server
div_message.innerHTML = xmlhttp.ResponseText;
}
</SKRIP>
di sisi server
menggunakan objek yang sama untuk menyediakan fungsionalitas pemrosesan unggahan sisi server.
<%@ BAHASA=VBScript%>
<% Opsi Eksplisit
Response.Expires = 0
' Definisikan variabel dan objek.
redupkan ado_stream
dimxml_dom
dim xml_file1
'Buat objek Aliran
atur ado_stream = Server.CreateObject("ADODB.Stream")
' Buat objek XMLDOM dari objek Permintaan
setel xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.beban(permintaan)
'Baca node yang berisi data biner
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Buka objek Stream dan simpan data di dalamnya
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Tulis xml_file1.nodeTypedValue
'Penyimpanan berkas
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
' Hancurkan objek
atur ado_stream = Tidak ada
atur xml_dom = Tidak ada
'Kembalikan informasi ke browser
Respon.Tulis "Upload berhasil!"
%>
Anda juga dapat menggunakan objek Stream untuk memasukkan data ke dalam bidang BLOB database.
Keuntungan menggunakan metode ini adalah
tidak menyebabkan konversi halaman.
Tidak diperlukan komponen khusus.
Beberapa file dapat diunggah secara bersamaan.
Program ini ditulis dalam skrip murni dan dapat dengan mudah dimasukkan ke dalam kode lain tanpa kerjasama objek HTML apa pun. Logika ini juga dapat diimplementasikan dalam bahasa apa pun yang mendukung standar COM.
Pertimbangan keamanan sistem:
Metode ini hanya dapat digunakan pada jaringan internal karena memerlukan tingkat keamanan IE5 disetel ke "rendah". Diperlukan:
Izinkan skrip dan objek ActiveX. Pengaturan ini memungkinkan browser untuk mengeksekusi pernyataan JScript seperti "myobj = new activexobject(...)";
Akses lintas domain ke sumber data harus diizinkan. Pengaturan ini memungkinkan penggunaan objek Stream di sisi klien. MS XML DOM 3.0 dan MDAC 2.5 juga harus diinstal pada server dan klien.