0

您好我有以下代码将视频上传到服务器并相应地更新数据库。当我使用一堆图像和/或小视频运行此代码时,它可以正常工作。请看下面的代码:

for ($i=0; $i<count($_FILES['images']['error']); $i++) {
   if ($_FILES['images']['error'][$i] == UPLOAD_ERR_OK) {
       $tmpName = $_FILES['images']['tmp_name'][$i];
       $name = $_FILES['images']['name'][$i];
       $type = $_FILES['images']['type'][$i];
       if (strpos($type, 'image') !== false) {
           $type = "img";
       }elseif(strpos($type, 'video') !== false){
           $type = "vid";
       }else{
           exit();
       }
       move_uploaded_file(($tmpName), $dir.$name);
       $upload = array(
           'name'=>$name,
           'type'=>$type
       );
       $uploads[] = $upload;
   }
}

但是当我的客户尝试上传大于 64mb 的视频时,程序不会上传它......我已经尝试更改 max_file_size 和其他相应的参数以允许更大的文件。但我的客户托管服务提供商不允许这样做。

那么还有其他方法可以通过我的自定义 cms 将大文件上传到我的服务器吗?

托马斯

4

1 回答 1

1

正如评论中所说。参考资料如下代码示例。诀窍是将文件切割成小于上传限制的块。此方法可以扩展到当文件上传中断时,您可以继续上一个已知部分。:-)

帮助上传文件的基本 JavaScript 类,确定要发送到 PHP 服务器的块。

function fileUploader() {
    // Called when the file is selected
    this.onFileSelected = function() {
        // Read file input (input type="file")
        this.file = this.fileInput.files[0];
        this.file_size = this.file.size;
        this.chunk_size = (1024 * 1000);

        this.range_start = 0;
        this.range_end = this.chunk_size;

        this.slice_method = 'slice';
        this.request = new XMLHttpRequest();

        // Start uploading
        this.upload();
    };

    this.upload = function()
    {
        var self = this,
            chunk;

        // Last part reached
        if (this.range_end > this.file_size) {
            this.range_end = this.file_size;
        }

        // Chunk the file using the slice method
        chunk = this.file[this.slice_method](this.range_start, this.range_end);

        // Open a XMLHttpRequest
        var endpoint = "/url/to/php/server/for/processing";
        this.request.open('PUT', (endpoint));
        this.request.overrideMimeType('application/octet-stream');
        this.request.send(chunk);

        // Make sure we do it synchronously to prevent data corruption
        this.request.onreadystatechange = function()
        {
            if (self.request.readyState == XMLHttpRequest.DONE && self.request.status == 200) {
                self.onChunkComplete();
            }
        }
    };

    this.onChunkComplete = function()
    {
        if (this.range_end === this.file_size)
        {
            // We are done, stop uploading
            return;
        }

        this.range_start = this.range_end;
        this.range_end = this.range_start + this.chunk_size;
        this.upload();
    };
}

对于 PHP 位:

...  
$out = fopen("{$filePath}.partial", "a+");                      
fwrite($out, file_get_contents("php://input"));
fclose($out);
...

此处大警告,请务必正确验证并采取安全措施,以确保您的客户上传功能的安全。您正在将原始 PHP 输入写入文件。

上传完成后,您可以将文件重命名为其原始名称,包括正确的扩展名。

参考资料:
http ://creativejs.com/tutorials/advanced-uploading-techniques-part-1/index.html
https://secure.php.net/manual/en/wrappers.php.php

简而言之......它使用处理器将文件分成小块,使用常规方法上传文件(就像您通常上传文件一样),将输入附加到临时文件中。我遇到的一些陷阱是向端点发送额外的参数等,避免这些,因为它附加到文件中,它会损坏你的文件。

于 2017-08-30T08:03:33.270 回答