Apakah ada cara untuk menghitung hash MD5 file sebelum diunggah ke server menggunakan Javascript?
javascript
md5
LuRsT
sumber
sumber
Jawaban:
Meskipun ada implementasi JS dari algoritme MD5, browser lama biasanya tidak dapat membaca file dari sistem file lokal .
Saya menulisnya di tahun 2009. Lalu bagaimana dengan browser baru?
Dengan browser yang mendukung FileAPI , Anda * dapat * membaca konten file - pengguna harus memilihnya, baik dengan
<input>
elemen atau drag-and-drop. Mulai Jan 2013, berikut ini susunan browser utama:sumber
Saya telah membuat perpustakaan yang mengimplementasikan incremental md5 untuk melakukan hash file besar secara efisien. Pada dasarnya Anda membaca file dalam potongan (untuk menjaga memori rendah) dan melakukan hash secara bertahap. Anda mendapatkan penggunaan dasar dan contoh di readme.
Ketahuilah bahwa Anda memerlukan FileAPI HTML5, jadi pastikan untuk memeriksanya. Ada contoh lengkap di folder tes.
https://github.com/satazor/SparkMD5
sumber
.end()
metode tersebut. Jika Anda memanggil metode ini lagi maka itu memberikan hasil yang salah di lain waktu. Karena.end()
panggilan.reset()
internal. Ini adalah bencana pengkodean dan tidak baik untuk penulisan perpustakaan.sangat mudah untuk menghitung hash MD5 menggunakan fungsi MD5 dari CryptoJS dan API FileReader HTML5 . Potongan kode berikut menunjukkan bagaimana Anda dapat membaca data biner dan menghitung hash MD5 dari gambar yang telah diseret ke Browser Anda:
Saya merekomendasikan untuk menambahkan beberapa CSS untuk melihat area Drag & Drop:
Lebih lanjut tentang fungsionalitas Seret & Jatuhkan dapat ditemukan di sini: API File & FileReader
Saya menguji sampel di Google Chrome Versi 32.
sumber
readAsBinaryString()
belum distandarisasi dan tidak didukung oleh Internet Explorer. Saya tidak mengujinya di Edge, tetapi bahkan IE11 tidak mendukungnya.readAsBinaryString()
: caniuse.com/#feat=filereader - Microsoft Edge mendukungnya.readAsBinaryString()
karena tidak didukung oleh browser lama. Alternatif yang saya temukan adalah SparkMD5. Ia menggunakan API FileReader juga tetapi metodereadAsArrayBuffer
, yang didukung oleh IE. Dan itu bisa menangani file besar dengan membacanya dalam potongan.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
danQ
Dengan asumsi Anda menggunakan browser modern (yang mendukung API File HTML5), berikut ini cara Anda menghitung Hash MD5 dari file besar (ini akan menghitung hash pada potongan variabel)
sumber
Anda perlu menggunakan FileAPI. Ini tersedia di FF & Chrome terbaru, tetapi tidak di IE9. Ambil implementasi JS md5 yang disarankan di atas. Saya sudah mencoba ini dan meninggalkannya karena JS terlalu lambat (menit pada file gambar besar). Dapat mengunjungi kembali jika seseorang menulis ulang MD5 menggunakan array yang diketik.
Kode akan terlihat seperti ini:
sumber
reader
variabel akan menjadi file terakhir pada saat fungsi onload dijalankan.CryptoJS.lib.WordArray.create(arrayBuffer);
Yang tidak berguna dalam banyak kasus. Anda ingin MD5 dihitung di sisi klien, sehingga Anda dapat membandingkannya dengan kode yang dihitung ulang di sisi server dan menyimpulkan bahwa unggahan salah jika berbeda. Saya perlu melakukan itu dalam aplikasi yang bekerja dengan file besar data ilmiah, di mana menerima file yang tidak rusak adalah kuncinya. Kasus saya sederhana, karena MD5 pengguna sudah dihitung dari alat analisis data mereka, jadi saya hanya perlu menanyakannya kepada mereka dengan bidang teks.
sumber
Untuk mendapatkan file hash, ada banyak pilihan. Biasanya masalahnya adalah sangat lambat untuk mendapatkan hash file besar.
Saya membuat perpustakaan kecil yang mendapatkan hash file, dengan 64kb di awal file dan 64kb di akhir file.
Contoh langsung: http://marcu87.github.com/hashme/ dan perpustakaan: https://github.com/marcu87/hashme
sumber
Ada beberapa skrip di luar sana di internet untuk membuat Hash MD5.
Yang dari webtoolkit bagus, http://www.webtoolkit.info/javascript-md5.html
Meskipun, saya tidak percaya itu akan memiliki akses ke sistem file lokal karena akses itu terbatas.
sumber
harap Anda telah menemukan solusi yang baik sekarang. Jika tidak, solusi di bawah ini adalah implementasi janji ES6 berdasarkan js-spark-md5
sumber
Cuplikan berikut menunjukkan contoh, yang dapat mengarsipkan throughput 400 MB / dtk saat membaca dan mencirikan file.
Ini menggunakan pustaka yang disebut hash-wasm , yang didasarkan pada WebAssembly dan menghitung hash lebih cepat daripada pustaka js-only. Mulai tahun 2020, semua browser modern mendukung WebAssembly.
sumber
Dengan HTML5 saat ini seharusnya mungkin untuk menghitung hash md5 dari file biner, Tapi saya pikir langkah sebelumnya adalah untuk mengubah data banary BlobBuilder menjadi String, saya mencoba melakukan langkah ini: tetapi belum berhasil.
Berikut adalah kode yang saya coba: Mengonversi BlobBuilder menjadi string, dalam HTML5 Javascript
sumber
Saya tidak yakin ada cara di javascript untuk mengakses konten unggahan file. Jadi, Anda tidak dapat melihat konten file untuk menghasilkan jumlah MD5.
Namun Anda dapat mengirim file ke server, yang kemudian dapat mengirim kembali jumlah MD5 atau mengirim kembali konten file .. tetapi itu banyak pekerjaan dan mungkin tidak bermanfaat untuk tujuan Anda.
sumber