2017-08-26 4 views
1

J'essaye d'implémenter ng-file-upload avec le mode de téléchargement Resumable pour diviser de gros fichiers en morceaux et les fusionner une fois téléchargés. J'ai implémenté ng-file-upload dans de nombreux projets mais c'est la première fois que je le fais pour télécharger de gros fichiers.Resumable Upload avec ng-file-upload + PHP (fusionner des pièces)

Mon problème est que je ne sais pas comment faire fonctionner les fichiers côté serveur en PHP. Je dois juste télécharger des morceaux avec le nom de diferents mais je ne peux pas les fusionner.

Quelqu'un pourrait-il publier un exemple de code côté serveur en PHP pour faire fonctionner cette fonctionnalité?

C'est ce que je l'ai fait jusqu'à ce point:

AngularJS

$scope.uploadMediaFile = function (file) { 

     if(file) { 

      Upload.upload({ 
       ignoreLoadingBar: true, 
       url: 'app/api/upload/mediaFile.php', 
       resumeChunkSize: '1MB', 
       file: file 
      }).then(function (response) { 
       if(response.data.success) { 
        $scope.post.mediaFile = response.data.filename; 
        $scope.post.duration = response.data.duration; 
       } else { 
        console.error(response.data.error); 
       } 
      }, null, function (evt) { 
       console.log(part); 
       file.progress = Math.min(100, parseInt(100.0 * evt.loaded/evt.total)); 
      }); 
     } 
    }; 

mediaFile.php

$filename = $_FILES['file']['name']; 
$file_tmp = $_FILES['file']['tmp_name']; 

$file_ext = pathinfo($filename, PATHINFO_EXTENSION); 

$file_des = $_SERVER['DOCUMENT_ROOT'] . '/storage/content/temp/'; 

if(!file_exists($file_des)) mkdir($file_des); 

// Puting a diferent name for each file part 
$new_filename = uniqid() . "." . pathinfo($filename, PATHINFO_EXTENSION); 

move_uploaded_file($file_tmp, $file_des . $new_filename) 

Jusqu'à présent, je reçois beaucoup de morceaux de même fichier avec des noms diférents .

Répondre

1

Juste au cas où quelqu'un cherche une question similaire, je poste ma solution.

<?php 
// File chunk 
$filename = $_FILES['file']['name']; 
$file_tmp = $_FILES['file']['tmp_name']; 


// Defining temporary directory 

$file_des = $_SERVER['DOCUMENT_ROOT'] . '/storage/content/temp/'; 

// If not exists, create temp dir. 
if(!file_exists($file_des)) mkdir($file_des); 

// The first chunk have the original name of file uploaded 
// so, if it exists in temp dir, upload the other pieces 
// with anothers uniques names 
if(file_exists($file_des . $filename)) { 

    $new_name = uniqid() . "." . pathinfo($filename, PATHINFO_EXTENSION); 
    move_uploaded_file($file_tmp, $file_des . $new_name); 

    // Now, append the chunk file to the first base file. 
    $handle = fopen($file_des . $new_name, 'rb'); 
    $buff = fread($handle, filesize($file_des . $new_name)); 
    fclose($handle); 

    $final = fopen($file_des . $filename, 'ab'); 
    $write = fwrite($final, $buff); 
    fclose($final); 

    // Delete chunk 
    unlink($file_des . $new_name); 

} else { 

    /* MAKE SURE WE DELETE THE CONTENT OF THE DESTINATION FOLDER FIRST, 
     OTHERWISE CHUNKS WILL BE APPENDED FOR EVER 
     IN CASE YOU ARE TRYING TO UPLOAD A FILE WITH THE EXACT SAME NAME. 
     CAREFUL: YOU MAY PREFER TO DELETE ONLY THE FILE 
     INSTEAD OF THE FOLDER'S CONTENT, IN THE CASE 
     YOUR FOLDER CONTAINS MORE THAN ONE FILE. 
    */ 

    $files_to_delete = glob($file_des."*"); // get all file names 
    foreach($files_to_delete as $file) // iterate files 
    { 
     if(is_file($file)) 
     { 
     unlink($file); // delete file 
     } 
    } 


    // First chunk of file with original name. 
    move_uploaded_file($file_tmp, $file_des . $filename); 
}