ASP (Active Server Page) adalah produk Microsoft Karena mudah diprogram dan dapat dengan cepat mengembangkan situs web dinamis dengan fungsi yang canggih, banyak situs web (terutama intranet/ekstranet) kini mengadopsi model NT+IIS+ASP, menjadikan ASP sebagai yang terdepan. saat ini Bahasa scripting yang lebih populer untuk pengembangan situs web. Dalam layanan WEB, layanan pengunggahan file adalah fungsi yang sangat umum, namun PWS di bawah WIN9X tidak menyediakan komponen terkait di IIS di bawah NT menyediakan Posting Komponen akseptor, tetapi tidak mudah digunakan karena memeriksa hak akses WWW pengguna; Anda juga dapat mengunduh komponen terkait dari Internet, tetapi sebagian besar adalah komponen komersial, dan yang digunakan untuk mengunduh adalah versi uji coba waktu atau Ada batasan fungsionalitas. Karena ASP dapat memanggil komponen OLE/COM standar, kita dapat menggunakan alat pemrograman tingkat lanjut seperti VB/VC/DELPHI untuk menyesuaikan komponen unggah file ASP kita sendiri sesuai dengan kebutuhan kita untuk memenuhi persyaratan sistem aplikasi kita sendiri.
Berikut ini akan dibahas prinsip dan proses implementasi spesifik penggunaan DELPHI untuk mengembangkan komponen pengunggahan file untuk ASP.
1. Prinsip pelaksanaan pengunggahan file
Pengunggahan data berbasis web harus mematuhi standar RFC1867, tidak terkecuali data file yang diunggah. Misalnya, gunakan file halaman HTML berikut (delphiup.htm) untuk memilih file unggahan:
<!-- DelphiUp.htm: Antarmuka pengunggahan file -->
<html><head><title>Unggah file</title></head><body>
Terapkan pengunggahan file menggunakan komponen pengunggahan file yang ditulis dalam DELPHI
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>Simpan file sebagai: <input TYPE=text NAME="SaveAs">
<p>Silakan pilih file yang akan diunggah: <input TYPE=file NAME="FileData">
<input type="kirim" name="b1" value="Konfirmasi unggahan"> </p>
</bentuk>
</tubuh></html>
Ketika klien memilih file (seperti Test.TXT, yang isinya "Ini adalah konten file untuk diunggah.") dan tekan
Setelah tombol "Konfirmasi Unggah" mengirimkan data, data yang diterima oleh program sisi server akan berbentuk sebagai berikut:
--------------------------7cf1d6c47c#13#10
Disposisi Konten: form-data; name="SaveAs"#13#10#13#10
NamaFile Baru#13#10
--------------------------7cf1d6c47c#13#10
Disposisi Konten: form-data; name="FileData"; filename="D: est.txt"
Tipe Konten: teks/polos#13#10#13#10
Berikut isi file yang akan diupload. #13#10
--------------------------7cf1d6c47c#13#10
Disposisi Konten: data formulir; nama="b1"#13#10#13#10
Konfirmasi unggahan#13#10
--------------------------7cf1d6c47c--
Diantaranya, "--------------------------------7cf1d6c47c" merupakan pembatas yang digunakan untuk memisahkan setiap field pada form ( Membentuk);
#13#10 adalah representasi DELPHI dari karakter pengangkutan kembali dan umpan baris. Kita dapat memikirkannya seperti ini, deskripsi informasi setiap bidang formulir dimulai dengan pembatas ditambah sepasang pengangkutan kembali dan umpan baris #13#10; nama domain formulir dimulai dengan "nama="" dan diakhiri dengan """ ; bidang formulir Nilai dimulai dengan dua pasang karakter pengangkutan kembali dan pengumpan baris #13#10#13#10, dan diakhiri dengan sepasang karakter pengangkutan kembali dan pengumpan baris #13#10# ditambah pembatas; dimulai dengan "nama file="" dan diakhiri dengan """ di bagian akhir. Dengan flag tersebut kita bisa mendapatkan nama dan nilai field form serta nama file yang akan diupload, sehingga data file dapat dibaca dan disimpan.
2. Proses pelaksanaan upload file
Setelah memahami format data yang disebutkan di atas, maka tidak sulit lagi bagi kita untuk menulis sendiri komponen upload file.
(1) Mulai proyek untuk membuat komponen ASP
Jika Anda belum familiar dengan langkah-langkah menggunakan DELPHI untuk mengembangkan OLE Automation Server, silakan merujuk ke artikel "Menggunakan DELPHI untuk mengembangkan OLE Automation Server untuk ASP" di "Elektronik dan Komputer", Edisi 06, 1999.
Di sini kami hanya memperkenalkan langkah-langkahnya secara singkat.
1. Buat proyek Perpustakaan ActiveX
Di DELPHI, pilih menu File="Baru..., pilih "ActiveX Library" di tab ActiveX pada kotak dialog "Item Baru", dan DELPHI akan secara otomatis membuat proyek DLL PRoject1.
2. Membuat komponen Otomasi
Di DELPHI, pilih menu File="New..., pilih "Automation Object" di tab ActiveX pada kotak dialog "New Item"; lalu masukkan Nama Kelas (seperti "UploadFile") di "Automation Object Wizard " kotak dialog ,Instancing pilih "Beberapa Contoh". Setelah mengklik "OK", DELPHI akan secara otomatis membuat file TLB (Type Library) Project1_TLB.PAS dan file PAS (Unit) Unit1.PAS. Pada jendela desain Type Library, ganti nama Project1 menjadi MyUpload, maka kode registrasi OLE komponen unggah file adalah "MyUpload.UploadFile".
3. Perkenalkan perpustakaan tipe ASP
Untuk menggunakan lima objek bawaan ASP (Request, Response, Server, application, session), perpustakaan tipe ASP perlu diperkenalkan. Kami terutama menggunakan objek Permintaan untuk membaca data yang diteruskan dari klien ke server.
Pilih "Impor Jenis Perpustakaan" di menu Proyek, dan pilih "Perpustakaan Objek Halaman Server Aktif Microsoft (Versi)" di daftar "Perpustakaan Jenis" pada kotak dialog "Perpustakaan Jenis Impor". 2.0)" (Jika opsi ini tidak tersedia, pastikan IIS3 atau lebih tinggi atau PWS4 atau lebih tinggi diinstal pada komputer Anda dan ASP.DLL telah terdaftar dengan benar), D ELPHI secara otomatis akan membuat file TLB ASPTypeLibrary_TLB.PAS, yang berisi deklarasi tipe objek ASP yang kita perlukan.
4. Tentukan proses OnStartPage dan OnEndPage
Saat menggunakan Server.CreateObject untuk membuat instance objek OLE pada halaman ASP, server WEB akan memanggil metode OnStartPage dan meneruskan informasi lingkungan aplikasi ASP ke objek. , kita dapat memperoleh informasi klien selama proses ini; ketika instance objek OLE dirilis di halaman ASP, server WEB akan memanggil metodenya OnEndPage, dan kita dapat melakukan operasi akhir seperti melepaskan memori selama proses ini. Di komponen kita, kita perlu menggunakan metode OnStartPage-nya.
Metode OnStartPage harus didefinisikan di Unit1.PAS. Prototipe fungsi OnStartPage adalah:
prosedur OnStartPage(AScriptingContext: IUnknown);
Parameter AScriptingContext adalah variabel tipe IScriptingContext, termasuk lima atribut (Permintaan, Respons, Server, Aplikasi, Sesi) yang sesuai dengan lima objek bawaan dengan nama yang sama di ASP.
Kita perlu menambahkan metode OnStartPage ke IUploadFile di jendela definisi TLB (View="Type Library), dan pernyataan Deklarasinya adalah "prosedur OnStartPage(AScriptingContext: IUnknown);".
(2) Ekstrak data yang diunggah oleh klien
Pekerjaan ini dapat dilakukan dalam proses OnStartPage.
Menggunakan properti TotalBytes (panjang konten informasi permintaan) dan metode BinaryRead di properti Permintaan (tipe IRequest) dari AScriptingContext, data informasi permintaan yang diunggah oleh klien dapat dibaca ke dalam array tipe Byte, dan kemudian format data yang ditentukan oleh RFC1867 standar untuk menganalisis dan mengekstrak data.
1. Pertama tentukan beberapa variabel privat TUploadFile
Tambahkan referensi ke ASPTypeLibrary_TLB.PAS (Penggunaan) di file unit UP01.PAS (disimpan oleh Unit1.PAS),
kemudian bergabung
pribadi
FContentLength: LongInt; //Minta panjang konten informasi
FContentData: Varian;//Data konten, menyimpan konten informasi permintaan dalam bentuk array
FFileName, //Nama file yang akan diupload
FDelimeter: string; //Pembatas bidang formulir
FScriptingContext: IScriptingContext;//ASP memproses konten konteks
FFileDataStart, //Posisi awal data file
FFileDataEnd: LongInt; //Posisi akhir data file
2. Ekstrak data informasi permintaan yang diunggah oleh klien
//Dalam acara OnStartPage, dapatkan informasi konteks ASP, isi informasi permintaan, pembatas bidang formulir, dan data file
prosedur TUploadFile.OnStartPage(AScriptingContext: IUnknown);
var
Permintaan: Permintaan Saya; //objek permintaan WWW
AOleVariant: OleVariant; //Catat panjang konten informasi permintaan
intDelimterLength: integer;//Panjang pembatas
longIndex, ALongInt, longPos : LongInt;
ContentData: AnsiString;//Representasi string dari konten informasi permintaan
strTemp: tali;
FindEndOfFileData: boolean;//Apakah posisi akhir data file ditemukan
mulai
//Ekstrak data informasi permintaan yang diunggah oleh klien
FScriptingContext := AScriptingContext sebagai IScriptingContext;//Dapatkan informasi konteks ASP
ARequest := FScriptingContext.Request;//Dapatkan informasi permintaan WWW
FContentLength := ARequest.TotalBytes;//Minta panjang konten informasi
//Membuat array dinamis untuk menyimpan konten informasi permintaan dalam bentuk array
FContentData := VarArrayCreate( [0,FContentLength], varByte );
//Simpan konten informasi permintaan ke dalam array
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);//Baca konten informasi permintaan
//Ubah konten informasi permintaan menjadi string untuk memudahkan pemosisian
Data Konten := ';
untuk longIndex := 0 hingga FContentLength - 1 lakukan
mulai
ContentData := ContentData + chr( Byte( FContentData[ longIndex ] ));
jika FContentData[ longIndex ] = 0 maka break;//0 menunjukkan akhir konten
akhir;
3. Dapatkan pembatas dan unggah nama file
//Dapatkan pembatas kolom formulir
longPos := pos( #13#10,ContentData );//Posisi karakter pengangkutan kembali dan pengumpan baris
FDelimeter := Copy( ContentData,1,longPos-1);//Konten sebelum posisi ini adalah pembatas
//Dapatkan nama file dengan jalur sumber. Dalam konten informasi permintaan, nama file dimulai dengan
//Penyimpanan dalam bentuk filename="path/filename"
strTemp := 'filename="';//Nama file setelah "filename=""
longPos := pos( strTemp, ContentData );//Dapatkan posisi "nama file="".
jika longPos <= 0 maka
mulai
Nama File F := ';
FFileDataMulai := -1;
FFileDataEnd := -2;
KELUAR;
akhir;
//Dapatkan konten sebelum tanda kutip ganda berikutnya """, yaitu nama file dengan jalur sumber
longPos := longPos + panjang( strTemp );
strTemp := ';
untuk longIndex := longPos ke FContentLength - 1 lakukan
jika ContentData[ longIndex ] <> '"' maka
strTemp := strTemp + Data Konten[indeks panjang ]
kalau tidak, istirahat;
Nama File F := strTemp;
4. Dapatkan posisi awal dan akhir data file dalam konten informasi permintaan
//Posisi awal data file adalah setelah #13#10#13#10 pertama setelah nama file
hapus( ContentData, 1, longIndex );
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + panjang(strTemp) - 1;
//Posisi akhir data file adalah sebelum #13#10 berikutnya dan pembatas
//Karena data file mungkin berisi karakter ilegal, fungsi pemosisian string POS tidak dapat digunakan lagi.
//Temukan posisi pembatas berikutnya
FFileDataEnd := FFileDataMulai;
intDelimterLength := panjang( FDelimeter );
FindEndOfFileData := salah;
sementara FFileDataEnd <= FContentLength - intDelimterLength lakukan
mulai
FindEndOfFileData := benar;
untuk ALongInt := 0 hingga intDelimterLength - 1 lakukan
jika Byte( FDelimeter[ ALongInt + 1 ] ) <>
FContentData[FFileDataEnd + ALongInt] lalu
mulai
FindEndOfFileData := salah;
merusak;
akhir;
jika FindEndOfFileData kemudian rusak;
FFileDataEnd := FFileDataEnd + 1;
akhir;
jika bukan FindEndOfFileData maka FFileDataEnd := FFileDataStart - 1//Tidak ditemukan pembatas
else FFileDataEnd := FFileDataEnd - 3;//Pembatas, lewati #13#10
akhir;
(3) Mengirimkan informasi ke program ASP
Setelah melakukan operasi (2), komponen unggahan kami dapat meneruskan data ke program ASP sesuai dengan kebutuhannya. Data yang tersedia saat ini meliputi: nama file sumber klien (FFileName, termasuk jalur), ukuran file (FFileDataEnd-FFileDataStart+1).
Pertama, dua metode berikut GetFileName dan GetFileSize harus dideklarasikan di jendela desain TLB.
1. Kembalikan nama file sumber klien (termasuk jalur)
//Kembalikan nama file sumber klien (termasuk jalur)
fungsi TUploadFile.GetFileName: OleVariant;
mulai
hasil := FFileName;//Nama file sumber klien (termasuk jalur)
akhir;
2. Kembalikan ukuran file
//Mengembalikan ukuran file (Byte)
fungsi TUploadFile.GetFileSize: OleVariant;
mulai
hasil := FFileDataEnd - FFileDataStart + 1;
akhir;
(4) Simpan file
Setelah melakukan operasi (2), komponen unggahan kami dapat menyimpan file sesuai dengan persyaratan program ASP. Pertama, itu harus masuk
Dua metode berikut, SaveFileAs dan SaveFile, dideklarasikan di jendela desain TLB.
1. Simpan file sesuai nama file yang ditentukan
//Simpan file sesuai dengan nama file yang ditentukan. Parameter Nama File adalah nama file yang ditentukan. Nilai kembalian True menunjukkan bahwa file berhasil disimpan.
fungsi TUploadFile.SaveFileAs(Nama File: OleVariant): OleVariant;
var
indeks panjang : LongInt;
AFile: file byte;//Simpan file dalam bentuk biner
byteData : Byte;
mulai
hasil := benar;
mencoba
menetapkan(AFile, Nama File);
menulis ulang(AFile);
untuk longIndex := FFileDataStart hingga FFileDataEnd lakukan
mulai
byteData := Byte( FContentData[indeks panjang ] );
Tulis(AFile, byteData);
akhir;
Tutup File( AFile );
kecuali
hasil := salah;
akhir;
akhir;
2. Simpan file dengan nama file default
//Simpan file sesuai dengan nama file default, dan simpan file dengan nama yang sama di direktori tempat halaman pemanggil berada
fungsi TUploadFile.SaveFile: OleVariant;
var
Jalur File Saat Ini : string;
mulai
//Dapatkan direktori tempat halaman pemanggil berada
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
Jalur File Saat Ini := Ekstrak FilePath( Jalur File Saat Ini );
//simpan berkas
hasil := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
akhir;
3. Contoh penerapan komponen upload
Dalam contoh kita, DelphiUp.HTM adalah antarmuka pengunggahan file, dan DelphiUp.ASP digunakan untuk melakukan operasi pengunggahan file.
Kode DelphiUp.ASP adalah sebagai berikut:
<!--DelphiUp.ASP: Halaman pemrosesan pengunggahan file-->
<html><head><title>Unggah file</title></head><body>
<% redup Unggah, Nama File
atur Unggah = Server.CreateObject("Unggahan Saya.UnggahFile")
Nama File = Unggah.DapatkanNamaFile
Response.Tulis "<br>Menyimpan file ""&NamaFile&""..."
jika Unggah.SimpanFile lalu
Response.Write "<br>File ""&NamaFile&"" berhasil diunggah."
Response.Write "<br>Ukuran file adalah "&Upload.GetFileSize&" byte."
kalau tidak
Response.Write "<br>File ""&NamaFile&"" gagal diunggah."
berakhir jika
atur Unggah=tidak ada %>
</tubuh></html>
4. Beberapa penjelasan
1. Ukuran file DLL yang dikompilasi dari kode sumber yang dihasilkan secara otomatis oleh DELPHI adalah 215K, yang dapat ditemukan di
Di bagian Antarmuka ASPTypeLibrary_TLB.PAS, hapus semua unit di Penggunaan kecuali ActiveX.
Dengan menghapus semua unit di Uses di MyUpload_TLB.PAS, ukuran file DLL yang dihasilkan dapat dikurangi menjadi 61K.
2. Cara diatas juga bisa diterapkan pada program CGI, namun harus menggunakan objek TWebRequest.
Program di atas telah di-debug dan diteruskan di bawah PWIN98+Delphi3.0+PWS4.0.