【问题标题】:Resumable Upload with ng-file-upload + PHP (Merging parts)使用 ng-file-upload + PHP 可恢复上传(合并部分)
【发布时间】:2017-08-26 18:10:49
【问题描述】:

我正在尝试使用可恢复上传模式实现ng-file-upload,以将大文件分成块并在上传后合并它们。我已经在许多项目中实现了 ng-file-upload,但这是我第一次这样做来上传这么大的文件。

我的问题是我不知道如何使它在 PHP 中的服务器端文件中工作。我只需要上传不同名称的块,但我无法合并它们。

任何人都可以在 PHP 中发布一个服务器端代码示例来实现此功能吗?

这是我到目前为止所做的:

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)

到目前为止,我得到了许多具有不同名称的相同文件。

【问题讨论】:

    标签: php file-upload ng-file-upload chunks


    【解决方案1】:

    以防万一有人正在寻找类似的问题,我发布我的解决方案。

    <?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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2016-11-09
      • 2017-02-13
      • 2017-08-16
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多