2016-05-03 4 views
1

Ich bin mit Winkel ng-Upload-Datei zu laden, hier ist mein Javascript-Code:Deal chunk hochgeladenen Dateien in PHP

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

Da ich Datei in Stücke bin hochladen, ich möchte, dass die Backend-PHP zu lesen und Verketten Sie diese Stücke zurück, wie mache ich das jetzt? Mein aktueller PHP-Code wie folgt aussieht:

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

Dennoch bin ich ziemlich sicher, dass dies nicht für chunk uploads funktioniert ...

Antwort

1

Ok, ich habe gedacht. Bei Verwendung der Chunk-Upload-Funktion einiger JavaScript-Bibliotheken haben sie Parameter, die über die Chunk-Informationen an das Backend übergeben werden. Im Falle des Hochladens von ng-Dateien sind diese Parameter _chunkNumber, _chunkSize und _totalSize. Ich glaube dasselbe für Plupload. Machen Sie etwas Mathematik, Sie wissen, wie viele Chunks benötigt werden, damit die Datei fertig hochgeladen werden kann. Für jeden Chunk-Upload wird eine HTTP-Post-Anfrage an das Backend-PHP gesendet. Genug geredet, Code hier:

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 und ng-Datei-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'); 
}); 
Verwandte Themen