Unggah file dan unduhan adalah masalah umum yang dihadapi dalam pengembangan web. Dalam beberapa hari terakhir, unduhan file telah digunakan dalam suatu proyek. Saya juga telah membuat beberapa catatan dengan cara yang tersebar sebelumnya. Hari ini saya akan mengaturnya. Mengunggah file perlu pengujian lebih lanjut, mari kita bicara tentang unduhan file terlebih dahulu.
1. Proses Pemrosesan Pengunduhan File
Proses unduhan file sebenarnya sangat jelas, yaitu:
1. Temukan file berdasarkan nama file atau jalur file. Strategi spesifik terutama didasarkan pada kebutuhan Anda sendiri. Singkatnya, jalur lengkap file yang dapat ditemukan sistem diperlukan.
2. Dapatkan aliran input dan dapatkan aliran input dari file target.
3. Dapatkan aliran output dan dapatkan aliran output dari respons.
4. Baca file dari aliran input dan output file melalui aliran output. Ini adalah proses eksekusi unduhan yang sebenarnya.
5. Matikan aliran IO.
Ini adalah proses utama, dan ada beberapa pengaturan atribut yang diperlukan, seperti jenis konten yang lebih penting dari file pengaturan, dll.
2. Jangan bicara lagi, tambahkan kodenya
Saya melakukannya dengan SpringMVC, tetapi pada kenyataannya, hal yang sama berlaku untuk hal -hal lain. Saya terutama membutuhkan objek httpservletResponse dan file target yang valid.
1. Kode meja depan
/** Unduh File yang Diunggah*/Fungsi UnduhFromupLoad (fileName) {window.location.href = path + "/unduh? Dir = unggah & filename =" + encodeuri (encodeuri (fileName));}/** Unduh Normal*/Fungsi Unduh (fileName) {window.location.href = PATH = PATH + PATH +* Normal* "/Unduh? Dir = Unduh & FileName ="+encodeuri (encodeuri (nama file));}2. Kode pengontrol
/*** File download (download from the upload path)* * @param request* @param response* @throws IOException*/@ResponseBody@RequestMapping(value = "/download")public void downloadFile(HttpServletRequest request,HttpServletResponse response, FileModel model) throws Exception {String fileName = URLDecoder.decode(model.getFileName(), "UTF-8");/** Batasi hanya file dalam unggahan dan folder unduh dapat diunduh*/string folderName = "download"; if (! Stringutils.isempty (model.getDir ()) && model.getDir (). Equals ("unggah")) {foldername = "unggah";} lipatan {lipter = "unggah") {folderName = "unggah";} {{{"unggah") {{"{" request.getSession (). getSerVletContext (). getRealPath ("/")+ "/web-inf/"+ foldername+ "/"+ filename; filetools.downloadFile (permintaan, respons, fileAbsolutePath); log.warn ("userid:"+ (integer) (request.getsession) (); (request.getSession (). getAttribute ("username")) + ", file yang diunduh:" + fileAbsolutePath);}Logika unduhan di sini adalah bahwa meja depan hanya perlu meminta/mengunduh dan memberikan parameter nama file. Untuk menghindari kode yang kacau Cina, ketika nama file latar depan digunakan sebagai parameter, ia menggunakan js 'encodeuri () untuk mengubahnya menjadi kode unicode, dan kemudian memecahkan kode menjadi Cina. Selain itu, karena sifat khusus dari proyek ini, file yang ingin saya unduh di sini mungkin ada di folder unggahan dan unduh, jadi ada bagian dari logika penilaian di sini. Selain itu, saya merangkum nama file dan nama folder yang diminta di FileModel.
3. Unduh Implementasi Logika.
Tidak ada layanan di sini, tetapi secara langsung diimplementasikan menggunakan metode statis.
/*** Tentukan nama unduhan saat mengunduh file** @param Permintaan* httpservletrequest* @param respons* httpservletResponse* @param filepath* jalur lengkap file* @param filename* tentukan nama file yang ditampilkan ketika klien mengunduh* @throws ioException*/Public Void Static Void (Public VoidRePile (Public LevelPle (ththrows IoException*/Public Void Static VOUDS Permintaan, respons httpservletResponse, string filePath, string fileName) melempar ioException {bufferedInputStream bis = null; bufferedOutputStream bos = null; bis = new bufferedInputStream (fileinputStream (filePath)); bos = new BufferedOutStream (response (response-getpath)); bos = new bufferedoutStream (response.exputeGeam. File (FilePath) .length (); response.setcharacterencoding ("UTF-8"); response.setContentType ("multipart/form-data");/** memecahkan masalah yang kacau Cina dari setiap browser*/string userAgent = request.getheader ("User-agent"); byte [] byte [] UserAgent = request.getHeader ("User-agent"); byte [] byte [] UserAgent = RECANTAING.GETEHET ("User-agent"); byte [] byte [] UserAgent = ABERAG. filename.getbytes (): filename.getbytes ("UTF-8"); // filename.getbytes ("UTF-8") menangani masalah kode yang diacak di safari filename = string baru (byte, "iso-8859-1"); // Semua browser pada dasarnya mendukung ISO encoding response.setHeader ("konten-disposisi", string.format ("lampiran; fileName =/"%s/"", fileName); response.setheader ("panjang konten", string. bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();}/*** The download file name is not specified when downloading the file* * @param request* HttpServletRequest* @param response* HttpServletResponse* @param filePath* Full path of the file* @Throws IoException*/public static void downloadfile (httpservletrequest, respons httpservletResponse, string filePath) melempar ioException {file file = file baru (filepath); downloadfile (permintaan, respons, filePath, file.getName ());}Berikut adalah metode unduhan yang kelebihan beban untuk menyelesaikan kebutuhan untuk kadang -kadang menentukan nama file yang diunduh oleh klien.
3. Hal -hal yang perlu diperhatikan
1. Tentang Pilihan Jenis Mime
Saya tidak tahu banyak tentang tipe Mime sebelumnya, tetapi saya menemukan bahwa ada banyak kode sumber yang diunduh di internet yang memiliki pengaturan yang berbeda. Itu adalah kalimat ini
response.setContentType ("multipart/form-data");Saya memeriksa bahwa salah satu fungsi pengaturan jenis MIME di sini adalah untuk memberi tahu browser klien untuk memproses file yang akan diunduh dalam format apa. Ada banyak penjelasan di situs web yang sesuai. Jika jenis kelas I ini diatur dalam format ini, format umumnya akan dicocokkan secara otomatis.
2. Tentukan nama file unduhan klien
Terkadang kita mungkin perlu menentukan nama file saat klien mengunduh file, yaitu kode ini
response.setHeader ("Disposisi Konten", String.Format ("Lampiran; FileName =/"%s/"", nama file));
Nama file di dalamnya dapat disesuaikan. Bagian depan tidak boleh dipindahkan.
3. Selesaikan masalah Cina yang kacau
Terlalu umum untuk file Cina untuk kacau. Ketika arsitektur sistem proyek pertama kali dibangun, semua pengkodean Cina harus disatukan, termasuk dalam editor, halaman dan database. Pengkodean UTF-8 direkomendasikan. Jika Anda menggunakan Spring, Anda juga dapat mengkonfigurasi filter set karakter Spring untuk lebih menghindari kode kacau Cina.
(1) Nama file dari proses permintaan unduhan klien rusak
Terkadang kita bertemu itu. Ketika halaman meja depan menampilkan daftar unduhan nama file Cina, itu normal, tetapi ketika kami pergi ke latar belakang, kami menemukan bahwa nama file dalam permintaan kacau. Pada saat ini, kita dapat menggunakan encodeuri yang disebutkan di atas untuk menyelesaikan masalah.
(2) Nama file kacau saat klien mengunduh dan mengeksekusi
Dalam tes yang sebenarnya, ditemukan bahwa ketika browser lain dapat mengeksekusi, nama file Cina di bawah IE mungkin tampak kacau. Saya melihat sepotong kode secara online. Setelah pengujian, itu dengan sempurna memecahkan masalah Cina yang kacau di browser yang berbeda.
/** Selesaikan masalah yang kacau Cina dari setiap browser*/string userAgent = request.getHeader ("User-agent"); byte [] bytes = userAgent.contains ("msie")? filename.getbytes (): filename.getbytes ("UTF-8"); // filename.getbytes ("UTF-8") menangani masalah yang kacau dari safari filename = string baru (byte, "iso-8859-1"); // Semua browser pada dasarnya mendukung ISO encoding response.setHeader ("konten-disposisi", string.format ("lampiran; fileName =/"%s/"", nama file));(3) File kacau di server
Server yang berbeda juga mungkin berbeda tergantung pada platform, jadi Anda perlu memperhatikannya di sini. Untuk solusi tertentu, silakan merujuk ke artikel yang saya tulis sebelumnya: Pemrosesan Berbobling Cina Selama Pengunduhan File.
Di atas adalah unduhan file implementasi web Java dan metode pemrosesan kacau yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!