загруженный файл слишком большой php

Привет, у меня есть следующий код, который загружает видео на сервер и соответствующим образом обновляет базу данных. Этот код отлично работает, когда я запускаю его с кучей изображений или небольших видео. См. код ниже:

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

Но когда мой клиент пытается загрузить видео размером более 64 МБ, программа не загружает его... Я уже пытался изменить max_file_size и другие соответствующие параметры, чтобы разрешить файлы большего размера. Но хостинг-провайдер моих клиентов не позволяет этого.

Итак, есть ли другие способы загрузки больших файлов на мой сервер через мою пользовательскую cms?

Томас


person FutureCake    schedule 30.08.2017    source источник
comment
Если ваш хост не позволяет вам изменить эти настройки в соответствии с вашими требованиями, найдите другой хост :)   -  person flauntster    schedule 30.08.2017
comment
Я бы с удовольствием, но это хозяин моего клиента..   -  person FutureCake    schedule 30.08.2017
comment
Если он слишком большой, начните резать! :-) Вы можете нарезать файл на кусочки размером с укус и добавить их в файл с помощью fwrite.   -  person Edwin    schedule 30.08.2017
comment
Один из возможных способов — загрузить свое видео на любой сторонний видеосервис, например Youtube, и использовать только ссылку.   -  person Happy Coder    schedule 30.08.2017
comment
@ da39a3ee Знаете ли вы, как это сделать? Я никогда не слышал об этом раньше...   -  person FutureCake    schedule 30.08.2017
comment
@HappyCoder Я не могу, мой клиент этого не хочет   -  person FutureCake    schedule 30.08.2017
comment
Ага, одну секунду добавлю ответ с примером на JS и PHP.   -  person Edwin    schedule 30.08.2017
comment
@da39a3ee Большое спасибо!   -  person FutureCake    schedule 30.08.2017


Ответы (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

В двух словах... это разбить файл на небольшие фрагменты с помощью процессора, загрузить файлы с помощью обычных методов (как вы обычно загружаете файл), добавить входные данные во временный файл. Некоторые ловушки, с которыми я столкнулся, заключались в отправке дополнительных параметров и тому подобного в конечную точку, избегайте их, поскольку они добавляются к файлу, и это повредит ваш файл.

person Edwin    schedule 30.08.2017