PHP dosyaların Tutkal topakları birlikte

0 Cevap php

Ben aslında şu yapar Dosya API aktarıcı, yazdık:

  1. Kullanıcı yüklemek için dosyaları seçer
  2. Dosya 20 kb parçalar halinde dilimlenmiş
  3. Topakları bir php script asenkron gönderilir
  4. PHP tüm parçalarını tarih kadar bekler, ve sonra tüm geçici dosyaları birlikte tutkallar
  5. Dosya - birbirine yapıştırılmış - kaydedilir

Ancak, PHP çok iyi hepsini birleştirdim değildir. Bazen, dosya birlikte iyi yapıştırılır, ancak (özellikle parçalarını bir sürü dosya üzerinde) çoğu kez dosya beraber yanlış yapıştırılır.

Js kodu: (sadece Firefox 4 beta çalışır):

 sendChunk: function(file, start, length) {
    var raw  = file.raw;
    var name  = file.name;
    var total  = file.size;

    var url = 'upload.php?name=' + encodeURIComponent(name) + '&total=' + total + '&start=' + start + '&length=' + length;
    var slice = raw.slice(start, length);
    var reader  = new FileReader();

    reader.readAsBinaryString(slice);
    reader.onload = function(e) {
        if(e.target.readyState === FileReader.DONE) {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", url);
            xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
            xhr.sendAsBinary(e.target.result);
        }
    };
};

PHP kodu:

<?php
$filename = $_GET['name'];
$total = $_GET['total'];
$start = $_GET['start'];
$length = $_GET['length'];

$uploaded = $start + $length;
$percentage = round($uploaded / ($total / 100));
$remaining = $total - $uploaded;

$fd = fopen("php://input", "r");
while($data = fread( $fd, 10000000)) file_put_contents("./tmp/$filename.$start", $data, FILE_APPEND);

if($remaining <= 0) {
    $handle  = opendir('tmp/');
    $data   = '';
    $collection = array();

    while(($file = readdir($handle)) !== false) {
        $arr  = explode('.', $file);
        $name  = '';
        $start  = $arr[count($arr) - 1];

        for($i = 0; $i < (count($arr) - 1); $i++) {
            if($name == '') $name .= $arr[$i];
            else $name .= '.' . $arr[$i];
        }

        if($name == $filename) {
            $collection[$start] = file_get_contents('./tmp/' . $file);
        }

        @unlink('./tmp/' . $file);
    }

    ksort($collection);

    foreach($collection as $key => $bin) {
        echo "(Added) $key: (binary data)\n";
        $data .= $bin;
    }

    if($data !== '') {
        file_put_contents('./uploads/' . $filename, $data);
    }

    closedir($handle);
} else {
    echo "Uploaded: $uploaded / $total ($percentage%)\n";
    echo "Remaining: " . $remaining . " (". (100 - $percentage) ."%)\n";
}
?>

Herkes herhangi bir fikir var? Benim tahminim FileReader uyumsuz çalışıyor olması, ve bu şekilde yanlış olan yanlış bir yığın gönderir start & length sendChunk yöntem parametreleri.

0 Cevap