Parçalar halinde büyük dosyaları yüklemek ve sunucu sınırlarından kaçınmak için JavaScript FileReader’ı kullanın
FileReader JavaScript API ile tanışın. Bu, dosyaları doğrudan tarayıcıda okumanın ve işlemenin kolay bir yoludur. JavaScript FileEader API artık Chrome, Firefox, Safari ve hatta Internet Explorer dahil olmak üzere ana tarayıcı desteğine sahiptir. FileReaders. Ateşin dosya yazarı JavaScript’e girildiği için, HTML tarafı kolaylaşır ve giriş öğesi dosyasıyla temel HTML formuna bağlıdır:
> kolaylaştırmak için kodumuzun çoğunu karşılamak için küçük bir sınıf oluşturacağız. Yukarıdaki formu WordPress Gösterge Tablosu Widget’a yerleştireceğiz:
wp_create_nonce (‘dbi-file-upload’),); } genel işlev add_dashboard_widget () {wp_add_dashboard_widget (‘dbi_file_upload’, ‘dbi dosya yükleme’, dizi ($ this, ‘render_dashboard_widget’)); } genel işlev render_dashboard_widget () {?> Lütfen bir dosya seçin ve devam etmek için “Yükle” yi tıklayın. “Düğme düğmesi-primary” type = “gönder” değer = “Yükle” /> <? PHP}} Yukarı yükleme formlarında, WordPress kontrol panelini ziyaret ettiğimizde temel dosya yükleme formunu göreceğiz: HTML form dosyasının yüklenmesi hiçbir şey yapmadı, bu yüzden bir dbi-file-uploader.js dosyası oluşturalım ve yükleme düğmesi için bir olay işleyicisi ekleyelim. Dosya nesnesini seçtikten ve FileReader nesneleri oluşturduktan sonra, çalışmayı başlatmak için upload_file () çağırır: (function ($) {var okuyucusu = {}; var files = {}; var slice_size = 1000 * 1024; function start_upload (olay ) {event.preventDefault (); okuyucu = yeni fileReader (); file = document.querysector (‘#dbi-file-upload’). Dosyalar [0]; upload_file (0);} $ (‘#dbi-file- Yükle -submit ‘) .on (‘ tıklayın ‘, start_upload); işlev upload_file (start) {}}) (jQuery); Şimdi ağır işin çoğunu yapacak olan upload_file () işlevi üzerinde çalışmaya başlayabiliriz. Önce JavaScript Slice () yöntemini kullanarak seçilen dosyanın bir parçasını alıyoruz: işlev upload_file (start) {var next_slice = start + slice_size + 1; var blob = file.slice (start, next_slice); } Ayrıca, FirEader API’si dosyadan okuduğunda çalışacak Upload_file () işlevine işlevler eklememiz gerekir. reader.onloadend = function (event) {if (event.target.readystate! == fileReader.done) {return; } // Bu noktada veri dosyası event.target.result} adresine yüklenir; Şimdi Fireader API’sına bir dosya içeriği okumasını söylemeliyiz. Bunu FileReAder nesnesine yaptığımız veri yığınını ileterek yapabiliriz: Reader. Readasdaurl (blob); Belgedeki FileReAder nesnesinin ReadasTeader () veya ReadasBinaryString () yöntemini değil, FileReader nesnesinin ReadasDaturl () yöntemini kullandığımıza dikkat edilmelidir.
ReadasDaturl () yöntemi burada daha iyidir, çünkü sıradan metin veya ikili verilerden daha temel64 olarak okunur. Bu önemlidir, çünkü ikincisi, özellikle temel metin dosyalarından başka bir şey yüklerken sunucuya gönderildiğinde kodlama sorunları yaşayacaktır. Base64 genellikle sadece AZ, AZ ve 0-9 karakter içerir. PHP ile kodu kırmak da kolaydır. Şimdi sunucuya yığın göndermek için Ajax çağrıları ekleyelim. Ajax Call, istek tamamlandığında tekrar upload_file () çağırır. Aşağıdaki upload_file () Genel: upload_file (start) işlevi {var next_slice = start + slice_size + 1; var blob = file.slice (start, next_slice); reader.onloadend = function (event) {if (event.target.readystate! == fileReader.done) {return; } $ .Ajax ({url: ajaxurl, type: ‘post’, dataType: ‘json’, cache: false, data: {aksiyon: ‘dbi_upload_file’, file_data: : file.type, nonce: dbi_vars.upload_file_nonce}, hata: işlev (jqxhr, textStatus, hata) {console.log (jqxhr, textstatus, hata); ); if (next_slice <file.size) {// Güncelle Yükleme İlerleme $ ('#DBI-Upload-Progress') .html ('Dosya-$ {Yüzde_done}%“ “); // daha fazla yükleme, çağrı işlevi özyinelemeli upload_file (next_slice);} else {// Güncelle Yükleme İlerleme $ ('#dbi-upload-progress') .html ('Yükle!');}}); }; Reader.ReadasDaturl (blob);
} Ve hepsi JavaScript dosya yükleme örneğimizin ön ucu için. Bu hala oldukça basit, ancak istemcinin tarafına dosya yüklemek yeterli. Sunucu tarafını iletme şimdi JavaScript dosyayı böldü ve sunucuya gönderdi, parçaları dosya sistemine yeniden monte etmemiz ve kaydetmemiz gerekiyor . Bunu yapmak için Ajax_upload_file () yöntemini ana eklenti sınıfımıza ekleyeceğiz: ajax_upload_file () genel işlev {check_ajax_referler (‘dbi-file-upload’, ‘noncce’); $ wp_upload_dir = wp_upload_dir (); $ file_path = trailingsLashite ($ wp_upload_dir [‘yol’]). $ _Post [‘dosya’]; $ file_data = $ this-> decode_chunk ($ _post [‘file_data’]); if (false === $ file_data) {wp_send_json_error (); } file_put_contents ($ file_path, $ file_data, file_append); wp_send_json_success (); } genel işlev Decode_chunk ($ data) {$ data = patlama (‘; base64,’, $ data); if (! Is_array ($ data) ||! isset ($ data [1])) {return false; } $ data = base64_decode ($ data [1]); if (! $ data) {return false; } dönüş $ data; } Bu, elde ettiğiniz kadar basittir – ajax_upload_file () yöntemi hızlı bir nonce muayenesi yapar ve daha sonra Decode_chunk () ‘daki verileri kod çözer. Veriler Base64’ten kod çözülebilirse, veriler dosyaya eklenir ve yükleme devam edilir.
Bununla birlikte, yükleyicimizi çalıştırabilmeliyiz ve dosya seçilen yola kaydedilecektir:
Ve sadece bu, çalışan bir işlev yükleyicimiz var! Eğer izlediyseniz ve tam kodu görmek istiyorsanız, görebilmeniz için GitHub’a yükledim. Sonuç, sunucu tarafında herhangi bir ayar ayarlamaya gerek kalmadan büyük dosyaları işleyebilecek başarısız bir dosya yükleyicisi yapmanın ne kadar kolay olduğunu seviyorum. Geçmişte sadece boruların hayalini kuran fikirlerin yaygınlaşması ve bugün iş akışını büyük ölçüde artırdığı her zaman ilginçtir. FineUploader ve JQuery dosya yüklemeleri gibi büyük dosyalar yükleyebilen birkaç JavaScript kitaplığının bulunduğuna dikkat edilmelidir. Birçok durumda, mevcut kodu kullanmak tekerlekleri yeniden oluşturmaktan daha mantıklıdır. Ancak hataları düzeltmeniz veya yeni özellikler eklemeniz gerekiyorsa perde arkasında neler olduğunu anlamak asla acıtmaz. Gerçek uygulamalarda böyle bir şey kullanacaksanız, kesinlikle herhangi bir güvenlik sorununu aramanız gerekecektir. Bu, dosya türlerinin doğrulanmasını içerebilir, yürütülen dosya yüklemelerini önleyebilir ve yüklenen dosyanın dosya adında rastgele bir dizeye sahip olduğundan emin olabilir. Ayrıca, kullanıcıların yüklemeleri duraklatmaları veya iptal etmeleri ve daha sonra geri gelmeleri için yollar eklemek ve yükleme sırasında görünen hataları kaydetmek isteyebilirsiniz. Hız için, admin-ajax.php’den daha fazla yangın dinlenmesini görebilirsiniz. Hiç büyük dosya yüklemelerini işlemek zorunda kaldınız mı? Evet ise, aynı yaklaşımı kullanıyor musunuz yoksa tamamen farklı bir şey mi yapıyorsunuz? Bana aşağıdaki yorumlarda söyle.