Я использую угловую ng-upload для загрузки файла, вот мой код javascript:
$scope.uploadFile = function(file) { Upload.upload({ url: '/upload_image', resumeChunkSize: '1MB', data: {file: file} }).then(function(response) { console.log('success'); }); };
Поскольку я загружаю файл в куски, я хочу, чтобы бэкэнд-php читал и конкатенировал эти куски, теперь как мне это сделать? Мой текущий PHP-код выглядит следующим образом:
$filename = $_FILES['file']['name']; $destination = '/someDestinationPath/' . $filename; move_uploaded_file( $_FILES['file']['tmp_name'] , $destination );
Тем не менее, я уверен, что это не работает для загрузки пакетов …
Хорошо, я понял. При использовании функции загрузки фрагментов из некоторых библиотек javascript у них есть параметры, переданные на бэкэнд о информации о куске. В случае ng-file-upload эти параметры: _chunkNumber, _chunkSize и _totalSize. Я считаю то же самое для Plupload. Сделайте некоторые математические вы будете знать, сколько кусков необходимо для этого файла, чтобы закончить загрузку. Для каждой загрузки кусков будет отправлен один HTTP-запрос, отправленный на серверный PHP. Достаточно говорить, код здесь:
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 и 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'); });