Abstrak: Artikel ini memperkenalkan dua metode JavaBean untuk mengimplementasikan banyak file upload, masing-masing menggunakan protokol http dan protokol ftp. Pertama, ini menjelaskan format dasar mentransfer banyak file melalui protokol http dan detail proses pengunggahan. Kemudian secara singkat memperkenalkan penggunaan kelas ftpclient untuk mengimplementasikan unggahan ftp, dan terakhir membandingkan kedua metode tersebut.
Kata Kunci: JavaBean, http, ftp, ftpclient
JavaBean merupakan komponen perangkat lunak berbasis Java. JSP menyediakan dukungan lengkap untuk mengintegrasikan komponen JavaBean dalam aplikasi Web. Dukungan ini tidak hanya mempersingkat waktu pengembangan (Anda dapat langsung menggunakan komponen yang sudah ada yang telah diuji dan dipercaya, menghindari pengembangan berulang), namun juga menghadirkan lebih banyak skalabilitas pada aplikasi JSP.
Fungsi unggah file sangat umum dalam model pengembangan berbasis B/S. Dibandingkan dengan alat pengembangan lainnya, dukungan JSP untuk pengunggahan file tidak sempurna, tidak memerlukan komponen yang lengkap seperti ASP, juga tidak secara langsung menyediakan dukungan untuk pengunggahan file seperti PHP. Cara JSP mengimplementasikan pengunggahan file adalah sebagai berikut: gunakan metode getInputStream() dari kelas ServletRequest untuk mendapatkan aliran data yang dikirim oleh klien ke server, lalu memproses aliran data ini untuk menganalisis dan mendapatkan berbagai parameter dan parameter yang diteruskan ke server pada saat mengunggah data file dan kemudian menyimpan data file di dalamnya sebagai file atau memasukkannya ke dalam database. Biasanya halaman JSP tidak menangani fungsi pengunggahan file, tetapi memasukkan fungsi-fungsi ini ke dalam Servlets atau JavaBeans untuk diimplementasikan. Contoh penggunaan Servlet untuk menyelesaikan unggahan file diperkenalkan di beberapa buku terkait JSP. Di sini saya akan memperkenalkan cara menggunakan JeanBean untuk menyelesaikan unggahan file. Ada dua cara untuk mengupload file di JSP, yaitu protokol HTTP dan protokol FTP. Ada perbedaan besar dalam prinsip transmisi antara keduanya. Berikut ini akan diberikan pengenalan singkat tentang implementasinya berdasarkan kode sumber. Saya yakin pembaca akan mendapatkan sesuatu darinya. Program berikut telah di-debug dan dilewati. Lingkungan debugging: server window 2000+Apache +Tomcat4.0, lingkungan debugging JavaBean: JDK1.4+Editplus.
Menggunakan JavaBean di JSP untuk mengimplementasikan fungsi unggah file berbasis Web umumnya memerlukan kombinasi tiga jenis file. Ketiga file ini masing-masing adalah file halaman HTML yang menyediakan antarmuka, file JSP yang menyelesaikan panggilan untuk mengimplementasikan fungsi unggah JavaBean, dan file kelas Java yang mengimplementasikan JavaBean. Di bawah ini saya akan fokus pada bagian JavaBean yang menggunakan protokol HTTP dan protokol FTP untuk mengimplementasikan fungsi upload file.
1 Gunakan protokol HTTP untuk mengunggah banyak file.
Di masa lalu, formulir Html tidak dapat mengunggah file, yang agak membatasi fungsi beberapa halaman web. Spesifikasi RFC1867 (yaitu, unggahan file berbasis formulir dalam Html) memperluas formulir dan menambahkan elemen formulir <input type=file>. Dengan menggunakan elemen ini, browser akan secara otomatis menghasilkan kotak input dan tombol. Kotak input memungkinkan pengguna untuk mengisi nama file lokal dan nama jalur, dan tombol tersebut memungkinkan browser untuk membuka kotak pemilihan file untuk pengguna untuk untuk. pilih file. Implementasi formulir spesifiknya adalah sebagai berikut:
<FORMMETHOD="POST" ACTION="*.jsp" ENCTYPE="multipart/form-data">
<INPUT TYPE="FILE" NAME="FILE1" UKURAN="50"><BR>
<INPUT TYPE="KIRIM" NILAI="Unggah">
</FORM>
Saat Anda memilih untuk menempelkan file, masukkan langsung jalur absolut file lokal. Nilai atribut tindakan formulir adalah *.jsp, yang berarti permintaan (termasuk file yang diunggah) akan dikirim ke *..file jsp. Dalam proses ini, pengunggahan file melalui HTTP sebenarnya diterapkan. Pengunggahan file dari klien ke server didukung oleh Common Gateway Interface (CGI) dari protokol HTTP. Metode pengunggahan ini mengharuskan browser dan WEBServer mendukung Rfc1867. JavaBean memperoleh aliran data yang dikirim oleh klien ke server melalui metode getInputStream() kelas ServletRequest, menganalisis format file yang diunggah, dan mengeluarkan beberapa file ke file target di sisi server secara berurutan berdasarkan hasil analisis. Fungsi JavaBeande dalam contoh ini secara khusus diimplementasikan oleh kelas testUpload. Kerangka kelas TestUpload adalah sebagai berikut:
testUpload kelas publik
{
tes publikUnggah(){……}
inisialisasi kekosongan akhir publik (konfigurasi ServletConfig) menampilkan ServletException
{ m_application = config.getServletContext();
public void upload() menampilkan testUploadException, IOException, ServletException
{............}
kekosongan pribadi getDataSection(){………}
kekosongan pribadi getDataHeader(){………}
penyimpanan int publik (String destPathName)
melempar SmartUploadException, IOException, ServletException
{............}
…
}
Inisialisasi lingkungan berjalan Servlet melalui metode inisialisasi(). Gunakan metode upload() untuk mendapatkan aliran input, menganalisis format file yang diunggah, dan menetapkan atribut setiap file yang diunggah ke beberapa instance kelas File untuk diproses. Kelas File memanggil metode simpan () sesuai dengan atribut setiap file untuk mengeluarkan banyak file ke file target di sisi server secara berurutan. Metode upload() adalah kuncinya, yang digunakan untuk menganalisis format file yang dikirimkan oleh protokol http1.1. Setelah pengujian, kami mendapatkan format file transport stream, yang berguna untuk memahami metode upload(). Misalnya, unggah file My Documentstt.txt. Formatnya adalah sebagai berikut:
//Pemisah file
--------------------------7d226137250336
//Tajuk informasi file
Disposisi Konten: form-data; name="FILE1"; filename="C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documentstt.sql"
Tipe Konten: teks/polos
//Sumber konten file
membuat info tabel(
gambar konten null);
//Pembatas file berikutnya
--------------------------7d226137250336
Disposisi Konten: form-data; nama="FILE2"; nama file=""
Tipe Konten: aplikasi/aliran oktet
--------------------------------7d226137250336
Dari file di atas kita dapat melihat bahwa ketika mengunggah banyak file, protokol HTTP Semua dimasukkan ke dalam aliran masukan dan dibedakan dengan pembatas tertentu. Faktanya, metode upload() adalah menganalisis file di atas dan menentukan konten pembatas, format konten setiap file, nama jalur lengkap file, serta awal dan akhir data sebenarnya dari file tersebut. Satu hal yang perlu diperhatikan di sini adalah pembatasnya acak, semuanya adalah karakter sebelum karakter pengangkutan pertama dari file aliran transport.
Proses implementasi metode Upload() adalah: pertama-tama keluaran file aliran masukan ke array byte m_binArray, yang diimplementasikan melalui kode berikut.
m_totalBytes=1024; totalBaca=0;
untuk(; totalBaca < m_totalBytes; totalBaca += bacaBytes)
mencoba
{ m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
}catch(Exception e){ throw new SmartUploadException("Tidak dapat mengunggah.");}
Metode pembacaan multi-byte dalam loop digunakan di sini. Loop di atas terus membaca data hingga array terisi. Jika suatu file dapat diambil sepenuhnya, semua byte file juga dapat diambil. Namun karena kecepatan jaringan biasanya jauh lebih lambat dibandingkan CPU, program ini mudah untuk menghapus buffer jaringan sebelum semua data tiba. Faktanya, metode baca multibyte akan mengembalikan 0 ketika mencoba membaca data dari buffer jaringan yang sementara kosong tetapi terbuka, yang berarti tidak ada data tetapi aliran jaringan belum ditutup. Dalam hal ini, metode byte tunggal akan mencegah eksekusi program yang sedang berjalan, sehingga perilaku metode multi-byte lebih baik daripada metode read() byte tunggal. Selanjutnya array byte m_binArray akan dianalisis. Pertama temukan pembatas; gunakan metode getDataHeader() untuk mengembalikan nilai header informasi file, yang menentukan nama jalur lengkap file sumber, ekstensi file sumber, dan format konten file sumber; metode untuk mengembalikan data konten file dan mencatatnya Posisi awal dan akhir data file dalam array byte. Kemudian buat instance kelas File, dan masukkan nama jalur lengkap file, ekstensi file sumber, format konten file sumber, dan posisi awal dan akhir data konten file ke dalam atribut instance kelas File. Temukan pembatas berikutnya dan terus ulangi proses di atas hingga analisis selesai.
2 Gunakan protokol FTP untuk mengunggah banyak file.
Protokol FTP adalah protokol yang digunakan untuk mentransfer file di Internet. Protokol ini menetapkan standar untuk saling mentransfer file di Internet. Implementasi fungsi ini di java dilakukan dengan bantuan kelas FtpClient. Proses implementasi khusus: pertama membuat koneksi dengan server FTP; menginisialisasi metode transmisi file, termasuk ASCII dan BINARY; mengeluarkan file ke aliran input file FileInputStream; membaca data dalam FileInputStream ke dalam array byte; data ditulis ke aliran keluaran TelnetOutputStream (gunakan metode tulis untuk menulis data ke tautan jaringan). Dengan cara ini, file dengan nama yang sama dengan file sumber disalin ke server. Dalam contoh ini, JavaBean menyelesaikan proses pengunggahan file melalui tiga metode: connectServer(), upload(), dan closeConnect(). Implementasi utamanya adalah sebagai berikut:
ftpUpload kelas publik
{ String nama file;String nama file1;FtpClient ftpClient;
public void connectServer (server string, pengguna string, kata sandi string, jalur string)
{
//server: Alamat IP server FTP; pengguna: nama pengguna untuk masuk ke server FTP
//kata sandi: kata sandi nama pengguna untuk masuk ke jalur server FTP: jalur di server FTP
coba{ ftpClient=FtpClient baru();
ftpClient.openServer(server);
ftpClient.login(pengguna, kata sandi);
System.out.println("login berhasil!");
if (jalur.panjang()!=0) ftpClient.cd(jalur);
ftpClient.binary(); }tangkap (IOException ex) {System.out.println(ex);}
}
kekosongan publik closeConnect()
{coba{ ftpClient.closeServer();
}tangkap (IOException ex) {System.out.println(ex);}
}
unggahan kekosongan publik()
{ nama file1=findFileName(nama file);
//Analisis nama file dari nama file dan gunakan sebagai nama file target.
mencoba {
TelnetOutputStream os=ftpClient.put(namafile1);
java.io.File file_in=java.io.File baru(nama file);
FileInputStream adalah=FileInputStream baru(file_in);
byte[] byte=byte baru[1024];
ke dalam c;
while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c }
adalah.close(); os.close();
} catch (IOException ex) {System.out.println(ex);}
}
}
connectServer() menyelesaikan fungsi membuat koneksi dengan server FTP, menggunakan metode openServer(server string) FtpClient untuk membuka server FTP jarak jauh, dan kemudian menggunakan metode login(pengguna, kata sandi) FtpClient untuk masuk ke server. Ada dua cara untuk masuk ke server FTP jarak jauh, satu adalah dengan masuk sebagai pengguna terdaftar, dan yang lainnya adalah dengan masuk secara anonim. Yang pertama mengharuskan pengguna untuk mendaftar terlebih dahulu sebagai klien server. Server akan memberikan pengguna akun login dan kata sandi, dan terhubung ke server berdasarkan akun dan kata sandi. Yang terakhir mengharuskan pengguna untuk menggunakan nama pengguna khusus "mengganggu" dan "tamu" tanpa mendaftar untuk memiliki akses terbatas ke file publik di host jarak jauh. Banyak sistem sekarang mengharuskan pengguna untuk menggunakan alamat email mereka sebagai kata sandi. Untuk tujuan keamanan, sebagian besar host FTP anonim umumnya hanya mengizinkan pengguna jarak jauh untuk mengunduh file, tetapi tidak mengunggahnya. Hal ini bergantung pada pengaturan server FTP. Pengguna dapat memilih untuk menggunakan dua metode sesuai dengan kondisi sebenarnya. Setelah masuk, gunakan metode biner() FtpClient untuk menginisialisasi mode transmisi ke mode byte. upload() melengkapi fungsi unggah file. Buat aliran masukan file FileInputStream dari file sumber, tulis aliran masukan ke dalam larik byte, dan gunakan metode tulis TelnetOutputStream untuk menulis data dalam larik byte ke tautan jaringan. Karena TelnetOutputStream membuka file di server FTP, data ditulis ke file target, sehingga pengunggahan file selesai. closeConnect() memerlukan pemutusan sambungan dari server.
Di atas hanya proses upload satu file saja, jika ada beberapa file maka proses upload ini bisa dipanggil berkali-kali. Dari dua cara di atas, kita dapat melihat bahwa penggunaan protokol FTP untuk mengunggah banyak file relatif sederhana dan mudah diterapkan. Menggunakan protokol FTP untuk mengunggah file umumnya merupakan program sisi klien, dan pengaturan keamanan sisi server akan lebih rumit sedangkan menggunakan protokol HTTP untuk mengunggah file adalah aplikasi sisi server, dan pengaturan keamanan akan relatif sederhana; . Dan melalui pengujian, ditemukan bahwa metode upload FTP puluhan bahkan ratusan kali lebih cepat dibandingkan metode upload HTTP saat mengirimkan file berukuran besar, namun sedikit lebih lambat dibandingkan metode upload HTTP saat mengirimkan file berukuran lebih kecil dari 1M. Oleh karena itu, kedua metode transmisi tersebut memiliki kelebihannya masing-masing. Pembaca disarankan untuk bertindak sesuai dengan keadaannya masing-masing. Jika Anda memiliki pertanyaan atau memerlukan kode sumber bagian lain, silakan hubungi saya!