2016-05-03 2 views
1

J'utilise ng-upload angulaire pour télécharger le fichier, voici mon code javascript:Chunk Deal fichiers téléchargés en php

$scope.uploadFile = function(file) { 
    Upload.upload({ 
     url: '/upload_image', 
     resumeChunkSize: '1MB', 
     data: {file: file} 
    }).then(function(response) { 
     console.log('success'); 
    }); 
}; 

Depuis que je suis le téléchargement de fichiers en morceaux, je veux le backend php lire et concaténer ces morceaux en arrière, maintenant comment je fais ça? Mon code actuel php ressemble à ceci:

$filename = $_FILES['file']['name']; 
$destination = '/someDestinationPath/' . $filename; 
move_uploaded_file($_FILES['file']['tmp_name'] , $destination); 

Pourtant, je suis assez sûr que cela ne fonctionne pas pour le téléchargement de gros morceau ...

Répondre

1

Ok, je l'ai pensé. Lors de l'utilisation de la fonction de chargement de blocs de certaines bibliothèques javascript, ils ont des paramètres transmis à backend sur les informations de morceau. Dans le cas de ng-file-upload, ces paramètres sont _chunkNumber, _chunkSize et _totalSize. Je crois la même chose pour Plupload. Faites quelques calculs, vous saurez combien de morceaux sont nécessaires pour ce fichier pour terminer le téléchargement. Pour chaque téléchargement de bloc, il y aura une demande de post http envoyée au backend PHP. Assez parlé, code ici:

PHP:

// uid is used to identify chunked partial files so we can assemble them back when all chunks are finished uploading 
    $uid = $_REQUEST['uid']; 
    $filename = $_REQUEST['filename']; 
    if (empty($_FILES['file']['name'])) { 
     return ''; 
    } 
    if (isset($_POST['_chunkNumber'])) { 
     // the file is uploaded piece by piece, chunk mode 
     $current_chunk_number = $_REQUEST['_chunkNumber']; 
     $chunk_size = $_REQUEST['_chunkSize']; 
     $total_size = $_REQUEST['_totalSize']; 

     $upload_folder = base_path() . '/public/images/uploaded/'; 
     $total_chunk_number = ceil($total_size/$chunk_size); 
     move_uploaded_file($_FILES['file']['tmp_name'], $upload_folder . $uid . '.part' . $current_chunk_number); 
     // the last chunk of file has been received 
     if ($current_chunk_number == ($total_chunk_number - 1)) { 
      // reassemble the partial pieces to a whole file 
      for ($i = 0; $i < $total_chunk_number; $i ++) { 
       $content = file_get_contents($upload_folder . $uid . '.part' . $i); 
       file_put_contents($upload_folder . $filename, $content, FILE_APPEND); 
       unlink($upload_folder . $uid . '.part' . $i); 
      } 

     } 
    } else { 
     // the file is uploaded as a whole, no chunk mode 
     move_uploaded_file($_FILES['file']['tmp_name'], $upload_folder . $filename); 
    } 

Javascript (AngularJS et ng-file-upload):

Upload.upload({ 
    url: '/upload_image', 
    resumeChunkSize: '500KB', 
    data: { 
     filename: file.name 
     file: file 
     uid: toolbox.generateUniqueID() 
    } 
}).then(function(response) { 
    console.log('success'); 
}), function(response) { 
    console.log('error'); 
});