İlerleme Çubuğunu PHP'ye Yükleyin


82

Php'de bir yükleme için bir ilerleme çubuğunun nasıl alınacağını bilen var mı? Bir fotoğraf albümü yükleyicisi için kod yazmaya çalışıyorum. Fotoğraflar yüklenirken bir ilerleme çubuğunun görüntülenmesini istiyorum.

Ben php konusunda oldukça yeniyim, bu yüzden onun hakkında her şeyi bilmiyorum.


Yanıtlar:


70

Bu, şimdiye kadar (saatler süren googling ve komut dosyalarını denedikten sonra) kurması en basit ve bulduğum en güzel yükleyicidir

https://github.com/FineUploader/fine-uploader

APC veya başka herhangi bir harici PHP kitaplığı gerektirmez, paylaşılan bir ana bilgisayarda dosya ilerleme geri bildirimi alabilirim ve html5 sürükle ve bırak (kişisel olarak denenmemiş) ve çoklu dosya yüklemelerini desteklediğini iddia eder.


11
Bunun yerine bunu kullanmak isteyeceğinize inanıyorum: github.com/valums/file-uploader - aynı yazar.
Michael Reed

6
Ve lütfen PHP'nin kutudan dosya yüklemesi için ilerleme sağlamak için sunduğu Oturum Yükleme İlerlemesi'ne bakın .
hakre

7
@jpeskin bu, geliştiriciye biraz haksızlık olur. "onlara ödeme teklifinde bulunmanız", onları bir tür fahişe gibi sizin için çalışmak zorunda bırakmaz. nasıl hata ayıklayacağınızı çözemezseniz, o zaman kendinizden başka kimseyi işaret etmeyeceğim - internette bulduğunuz yazılım "olduğu gibi" sağlanır, bu yüzden etrafta dolaşıp yardım etmeye çalışmaktan başka bir şey yapmıyor.
sucitivel

3
@sucitivel Daha ayrıntılı olmak gerekirse: Ödemeyi teklif ettim ve o kabul etti, sonra gördüğümüz tüm hataları belgeleme zahmetine girdik ve sonra tüm e-postalara yanıt vermeyi bıraktı (sadece kibar olanlar, bir durum güncellemesi istemek ve o hala işle ilgileniyordu). Para için çalışmak zorunda kimseyi düşünmüyorum. Bu yalnızca, geliştiricinin serbest çalışmaya olan ilgisi ve / veya mevcudiyeti hakkında bilgi sahibi olmak isteyebilecek diğerleri için gözlemsel bir veri noktasıydı. Proje çatallanmıştı, bu yüzden geliştiricinin sürdürmeye olan ilgisini kaybettiğini hisseden tek kişi ben değildim.
jpeskin

5
blueimp.github.com/jQuery-File-Upload - bu gerçekten iyi çalışıyor. En azından Ubuntu altında
kalmadığı için seviyorum

13

Eğer varsa APC yüklü, bu yükleme ilerleme için bir geri arama kanca vardır.

Rasmus Lerdorf (PHP'nin yaratıcısı) YUI kullanarak bunun bir örneğine sahip (oh, ve işte PHP kaynağı ).

Buradaki belgelere bakın .


Ne aynı ne de php kaynak bağlantıları artık çalışmıyor .. Lütfen bir alt bağlantınız var mı?
supersan

@supersan Bu yanıt çok güncel değil. APC öldü ve Session Upload API artık ayrı bir şey . Ayrıca, sunucu FastCGI kullanıyorsa ... bu günlerde çoğu güvenlik nedenleriyle çalışmaz.
Powerlord

12

Bildiğim kadarıyla saf bir PHP yükleme ilerleme çubuğu veya hatta bir PHP / Javascript yükleme ilerleme çubuğu PHP'nin çalışma şekli nedeniyle mümkün olmadığını söylediğim için üzgünüm. En iyi bahsiniz, bir tür Flash yükleyici kullanmaktır.

AFAIK Bunun nedeni, betiğinizin $ _FILES içeren tüm süper küreseller doldurulana kadar çalıştırılmamasıdır. PHP betiğiniz çağrıldığında, dosya tamamen yüklenir.

DÜZENLEME: Bu artık doğru değil. 2010 yılındaydı.


13
Neden üç olumsuz oy? Bu doğru ve tamamen haksızlar. Herhangi birini bana yerel PHP üzerinde çalışan ve çalışmak için fazladan uzantılara / Apache modüllerine / perl betiklerine / diğer şeylere ihtiyaç duymayan bir ilerleme çubuğu göstermeye cesaret ediyorum.
Pekka

1
Yıl 2011 ve artık HTML5 sayesinde mümkün. İlk yanıtı buradan görün: stackoverflow.com/questions/76976/…
Zarel

10
Yıl 2012 ve XMLHttpRequest aracılığıyla HTML5'te dosya yükleme, tüm büyük tarayıcılarda hala mevcut değil.
Damien B

3
@Pekka 웃 Bu doğru değil. Eğer APC yüklüyse (ve yapmalısınız) bunu tamamen doğal olarak PHP'de yapabilirsiniz ve javascript de kullanamazsınız.
Ariel

2
@Pekka 웃 PHP'de oturum bilgilerini kullanarak yüklemeden bahsetmiyorum> = 5.4.
Wookie88

8

Benim için güzel çalışan bir PHP-ish (5.2+) ve Flashsız yol:

Öncelikle, "yükleme ilerleme" uzantısının nasıl çalışır duruma getirileceğini açıklayan bu gönderiye bakın.

Ardından, dosya (ları) yüklediğiniz formu içeren sayfada aşağıdaki iframe'i oluşturun:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

Ardından, bu kodu "Gönder" düğmenize ekleyin:

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"

Artık formunuzda, dosyaları yüklemeye başlamak için "Gönder" i tıkladığınızda görünür olacak ve uploadprogress.php içeriğini gösteren gizli bir iframe var. $ upload_id, formunuzda gizli alan "UPLOAD_IDENTIFIER" olarak kullandığınızla aynı olmalıdır.

Uploadprogress.php'nin kendisi şöyle görünür (ihtiyaçlarınızı düzeltin ve ayarlayın):

<html>
<head>
<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'>
</head>
<body>
Upload progress:<br />
<?php
    if(!$_GET['id']) die;
    $info = uploadprogress_get_info($_GET['id']);
    $kbytes_total = round($info['bytes_total'] / 1024);
    $kbytes_uploaded = round($info['bytes_uploaded'] / 1024);
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB';
?>
</body>
</html>

Her saniye kendini yenilediğini unutmayın. İsterseniz buraya kesinlikle güzel bir görsel ilerleme çubuğu ekleyebilirsiniz (farklı renklere sahip 2 iç içe geçmiş <div> gibi). Yükleme ilerlemesine sahip iframe, doğal olarak yalnızca yükleme devam ederken çalışır ve form gönderilip tarayıcı sonraki sayfaya yeniden yüklendiğinde görünür ömrünü sona erdirir.


$ _FILES olmadan php olarak nasıl dosya yükleyebilirsiniz

4

Yükleme ilerleme çubuğunun uygulanması kolaydır ve herhangi bir ek PHP uzantısı, JavaScript veya Flash gerektirmez. Ancak PHP 5.4 ve daha yenisine ihtiyacınız var .

Sen direktifini ayarlayarak yükleme ilerleme bilgilerinin toplanması sağlamak zorunda session.upload_progress.enablediçin Onde php.ini.

Ardından, diğer dosya girişlerinden hemen önce HTML yükleme formuna gizli bir giriş ekleyin . HTML özelliği namebu gizli girdinin direktifin değeri ile aynı olmalıdır session.upload_progress.namedan php.ini(sonunda öncesinde session.upload_progress.prefix). valueÖzniteliği oturum anahtarının bir parçası olarak kullanılacaktır, size kalmış.

HTML formu şöyle görünebilir:

<form action="upload.php" method="POST" enctype="multipart/form-data">
   <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" />
   <input type="file" name="file1" />
   <input type="submit" />
</form>

Bu formu gönderdiğinizde, PHP $_SESSION, karşıya yükleme durumu bilgileriyle doldurulacak süper küresel yapıda yeni bir anahtar oluşturmalıdır . Anahtar sıralı nameve valuegizli girdidir.

PHP'de doldurulmuş yükleme bilgilerine göz atabilirsiniz:

var_dump($_SESSION[
    ini_get('session.upload_progress.prefix')
   .ini_get('session.upload_progress.name')
   .'_myupload'
]);

Çıktı aşağıdakine benzer şekilde görünecektir:

$_SESSION["upload_progress_myupload"] = array(
  "start_time" => 1234567890,   // The request time
  "content_length" => 57343257, // POST content length
  "bytes_processed" => 54321,   // Amount of bytes received and processed
  "done" => false,              // true when the POST handler has finished, successfully or not
  "files" => array(
    0 => array(
      "field_name" => "file1",    // Name of the <input /> field
      // The following 3 elements equals those in $_FILES
      "name" => "filename.ext",
      "tmp_name" => "/tmp/phpxxxxxx",
      "error" => 0,
      "done" => false,            // True when the POST handler has finished handling this file
      "start_time" => 1234567890, // When this file has started to be processed
      "bytes_processed" => 54321, // Number of bytes received and processed for this file
    )
  )
);

Bir ilerleme çubuğu oluşturmak için gereken tüm bilgiler vardır - yükleme hala devam ediyorsa, toplamda kaç baytın aktarılacağı ve halihazırda kaç baytın aktarıldığı bilgisine sahipsiniz.

Yüklemenin ilerlemesini kullanıcıya sunmak için, karşıya yüklemeden başka bir PHP betiği yazın; bu, yalnızca oturumdaki yükleme bilgilerine bakacak ve bunu JSON biçiminde döndürecektir. Bu komut dosyası, AJAX ve kullanıcıya sunulan bilgiler kullanılarak periyodik olarak, örneğin her saniye çağrılabilir.

Hatta ayarlayarak yüklemeyi iptal edebiliyoruz $_SESSION[$key]['cancel_upload']To true.

Ayrıntılı bilgi, ek ayarlar ve kullanıcı yorumları için PHP kılavuzuna bakın .


2

Başka bir yükleyici tam JS: http://developers.sirika.com/mfu/

  • Ücretsiz (BSD lisansı)
  • Uluslararasılaştırılabilir
  • tarayıcılar arası uyumlu
  • APC'yi yükleme seçeneğiniz var (eksik sonlandırma ilerleme çubuğu VS belirleme ilerleme çubuğu)
  • Dojo şablon mekanizmasını kullandığı için özelleştirilebilir görünüm. Css'nize göre sınıf / kimliklerinizi te şablonlarına ekleyebilirsiniz.

iyi eğlenceler


2

HTML5 , dosya yüklemelerinin ilerlemesini izlemenize izin veren bir dosya yükleme api'si sunmuştur , ancak daha eski tarayıcılar için, dosya yüklemelerini izlemek ve bunlar hakkında bilgi vermek için özel olarak yapılmış bir çerçeve eklenti vardır . ayrıca tüm tarayıcılarda çalışabilmesi için çok sayıda geri arama özelliği vardır


2

Gears ve HTML5, HttpRequestAJAX aracılığıyla bir dosya yüklemesi göndermek için nesnede bir ilerleme olayına sahiptir .

http://developer.mozilla.org/en/Using_files_from_web_applications

Başkalarının yanıtladığı diğer seçenekleriniz:

  1. Flash tabanlı yükleyici.
  2. Java tabanlı yükleyici.
  3. Web sunucusuna ikinci bir kuyruklu yıldız tarzı istek veya alınan verilerin boyutunu bildirmek için bir komut dosyası. Lighttpd gibi bazı web sunucuları, harici bir komut dosyası veya işlem çağırmanın ek yükünden tasarruf etmek için bu süreç içinde yapacak modüller sağlar.

Teknik olarak, YouTube yüklemesine benzer dördüncü bir seçenek vardır, Gears veya HTML5 ile, bir dosyayı küçük parçalara ayırmak ve her bir parçayı ayrı ayrı yüklemek için blobları kullanabilirsiniz. Her parçanın tamamlanması üzerine ilerleme durumunu güncelleyebilirsiniz.


1

Bir ilerleme çubuğu oluşturmak için Javascript kullanmanız gerekir. Basit bir Google araması beni şu makaleye götürdü: WebAppers CSS ile Basit Javascript İlerleme Çubuğu .

Dojo Dosya Yükleme İlerleme Çubuğu Widget'ı , Dojo Javascript çerçevesini kullanan başka bir seçenektir.

DÜZENLEME: Çok sayıda resim (bir fotoğraf albümü gibi) yüklediğinizi ve bunları PHP betiğinize POST olarak gönderdiğiniz varsayılarak, sonuçları gönderiden geri okumak ve yüklenen resim sayısına göre ilerleme çubuğunu güncellemek için javascript kullanabilirsiniz. / toplam görüntü sayısı. Bu, yalnızca her gönderi tamamlandıktan sonra güncelleme yan etkisine sahiptir. JS ile nasıl gönderi paylaşılacağı hakkında bazı bilgiler için buraya göz atın .


6
-1 Javascript ilerleme çubuğu güzel ama görebildiğim kadarıyla dosya yüklemeleriyle ilgisi yok. Ve Dojo yükleme ilerleme çubuğu PHP'ye herhangi bir arayüz sağlamıyor. Yanılıyorsam beni düzeltin.
Pekka

1

Bir php / ajax ilerleme çubuğu yapılabilir. (Armut'taki Html_Ajax kitaplığını kontrol edin). Ancak bu, php'ye özel bir modül yüklemeyi gerektirir.

Diğer yöntemler, php'nin dosyanın ne kadarının yüklendiğini görmek için göründüğü bir iframe kullanılmasını gerektirir. Ancak bu gizli iframe, bazı tarayıcı eklentileri tarafından engellenebilir çünkü gizli iframe'ler genellikle bir kullanıcının bilgisayarına kötü amaçlı veriler göndermek için kullanılır.

En iyi bahsiniz, sunucunuz üzerinde kontrolünüz yoksa bir tür flash ilerleme çubuğu kullanmaktır.


Bazı eklentiler iframe'leri engelleyebilir, ancak tarayıcılar? Bir örnek verebilir misin?
ya23

"Ajax php dosya yükleme" terimlerini Google'da araştırmak, tümü iframe kullanan ilk 5 sonucun 4'ünü döndürür (5. sayfanın yüklenip yüklenmediğinden emin değilsiniz). Sitelerin her birindeki örneklere bir göz atın.
Ali Lown

Aslında, iframe kullanıyorlar, ancak her durumda engellenebileceğinden bahsetmiyorlar. Yoksa bunu özledim mi?
ya23

Üzgünüm, sormaya çalıştığınız şeyi yanlış okuyun, hayır, iframe'leri doğrudan engelleyen herhangi bir tarayıcı örneği veremem, insanların onlarla birlikte kullandıkları, iframe'leri engelleyen noscript gibi eklentileri düşünüyordum. İleride başvurmak üzere gönderideki metin güncellendi.
Ali Lown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.