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

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

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?

Томас

0

Решение

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

Базовый класс 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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]