Μεταφόρτωση μεγάλου αρχείου με Javascript και PHP (Codeigniter)

Ένα απλό μεταφόρτωμα κομματιού με καθαρή Javascript, Codeiginter και PHP.

Για τη μεταφόρτωση μεγάλων αρχείων (πάνω από 2 GB) στον διακομιστή, πρέπει να επιτρέψουμε στους διακομιστές να δέχονται μεγάλα αιτήματα ανάρτησης και να αυξήσουν το όριο μεταφόρτωσης. Αλλά το να τεμαχίσουμε το αρχείο σε μέρη μας βοηθάει όχι μόνο να στέλνουμε μεγάλα αρχεία αλλά και να υλοποιούμε τη δυνατότητα αποστολής βιογραφικών. Σε αυτό το παράδειγμα υλοποιούμε τη μεταφόρτωση τμημάτων χωρίς δυνατότητα συνέχισης.

Πλευρά πελάτη (HTML )

<input type="file" id="file-uploader" name="video-file" />
<p class="percentage"></p>

Πλευρά πελάτη (Upload.js)

_('file-uploader').addEventListener('change', function(e) {
    const size = 5000000; // I don't know only 5MB of chunks works 
    var reader = new FileReader();
    var buf;
    var file = _('file-uploader').files[0];
    var totalUpload = 0;
    reader.onload = function(e) {
        buf = new Uint8Array(e.target.result);
        for (var i = 0;  i < buf.length; i += size) {
            var fd = new FormData();
            fd.append('fname', [file.name, i+1, 'of', buf.length].join('-'));
            fd.append('data', new Blob([buf.subarray(i, i + size)]));
            var oReq = new XMLHttpRequest();
            oReq.upload.addEventListener('progress', function(oEvent){
                if (oEvent.loaded === oEvent.total)
                    totalUpload = totalUpload + oEvent.total;
                __('percentage')[0].innerHTML = "<strong>Current Chunk Downloaded : "+Math.round((oEvent.loaded / size) * 100)+"%</strong><br>";
                __('percentage')[0].innerHTML += "<strong>Total Downloaded: "+Math.round((totalUpload / file.size) * 100)+"%</strong>";
                });
            oReq.open("POST", '/upload_video', true);
            oReq.send(fd);
            oReq.onload = function(){ __('percentage')[0].innerHTML = oReq.responseText;   }
            
        }
    }
    reader.readAsArrayBuffer(file);
});

Πλευρά διακομιστή (Server.php)

function upload_video(){
 foreach ($files as $file){
    $temp_file = fopen($file->getRealPath(), "rb");
    $buff = fread($temp_file, $file->getSize());
    fclose($temp_file);
    $final = fopen("/destination/filename","ab");
    $write = fwrite($final,$buff);
    fclose($final);
 }
}

Καλο κυνηγι..