Apakah mungkin untuk mendapatkan kemajuan XMLHttpRequest (byte diunggah, byte diunduh)?
Ini akan berguna untuk menampilkan bilah kemajuan saat pengguna mengunggah file besar. API standar tampaknya tidak mendukungnya, tapi mungkin ada beberapa ekstensi non-standar di salah satu browser di luar sana? Sepertinya fitur yang cukup jelas untuk dimiliki, karena klien tahu berapa banyak byte yang diunggah / diunduh.
Catatan: Saya mengetahui alternatif "polling server untuk kemajuan" (inilah yang saya lakukan sekarang). masalah utama dengan ini (selain kode sisi server yang rumit) adalah bahwa biasanya, saat mengunggah file besar, koneksi pengguna sepenuhnya disiram, karena sebagian besar ISP menawarkan hulu yang buruk. Jadi membuat permintaan tambahan tidak responsif seperti yang saya harapkan. Saya berharap akan ada cara (mungkin tidak standar) untuk mendapatkan informasi ini, yang dimiliki browser setiap saat.
sumber
Firefox mendukung acara kemajuan unduhan XHR .
sumber
Salah satu pendekatan yang paling menjanjikan tampaknya membuka saluran komunikasi kedua kembali ke server untuk menanyakan berapa banyak transfer telah selesai.
sumber
Firefox 3.5 akan mendukung acara kemajuan unggahan
sumber
Untuk total yang diunggah tampaknya tidak ada cara untuk mengatasinya, tetapi ada sesuatu yang mirip dengan yang Anda inginkan untuk diunduh. Setelah readyState adalah 3, Anda dapat secara berkala meminta responseText untuk mendapatkan semua konten yang diunduh sejauh String (ini tidak berfungsi di IE), hingga semuanya tersedia pada titik mana ia akan beralih ke readyState 4. Total byte yang diunduh pada waktu tertentu akan sama dengan total byte dalam string yang disimpan di responseText.
Untuk pendekatan semua atau tidak sama sekali terhadap pertanyaan unggahan, karena Anda harus memberikan string untuk unggah (dan dimungkinkan untuk menentukan total byte itu) total byte yang dikirim ke readyState 0 dan 1 akan menjadi 0, dan total untuk readyState 2 akan menjadi total byte dalam string yang Anda masukkan. Total byte yang dikirim dan diterima di readyState 3 dan 4 akan menjadi jumlah byte dalam string asli ditambah total byte dalam responseText.
sumber
sumber
Jika Anda memiliki akses ke instalasi apache dan mempercayai kode pihak ketiga, Anda dapat menggunakan modul progres unggah apache (jika Anda menggunakan apache; ada juga modul progres unggah nginx ).
Jika tidak, Anda harus menulis skrip yang dapat Anda tekan keluar dari band untuk meminta status file (misalnya memeriksa ukuran file dari file tmp).
Ada beberapa pekerjaan yang sedang berlangsung di firefox 3 Saya percaya untuk menambahkan dukungan kemajuan unggah ke browser, tapi itu tidak akan masuk ke semua browser dan diadopsi secara luas untuk sementara waktu (lebih disayangkan).
sumber
Satu-satunya cara untuk melakukannya dengan javascript murni adalah dengan menerapkan semacam mekanisme polling. Anda harus mengirim permintaan ajax pada interval tetap (misalnya masing-masing 5 detik) untuk mendapatkan jumlah byte yang diterima oleh server.
Cara yang lebih efisien adalah dengan menggunakan flash. FileReference komponen fleksibel mengirimkan secara berkala peristiwa 'progres' yang menahan jumlah byte yang sudah diunggah. Jika Anda harus tetap menggunakan javascript, jembatan tersedia antara skrip tindakan dan javascript. Berita baiknya adalah pekerjaan ini telah dilakukan untuk Anda :)
swfupload
Pustaka ini memungkinkan untuk mendaftarkan penangan javascript pada acara kemajuan flash.
Solusi ini memiliki keuntungan besar karena tidak memerlukan sumber daya tambahan di sisi server.
sumber