Jump to content

php://input falha com ficheiros grandes


Recommended Posts

Posted

Num sistema de upload que programei, estou a ter problemas com ficheiros > 80MB.

O script não retorna qualquer erro, nada, mesmo com

error_reporting(E_ALL | E_NOTICE);

ini_set('display_errors', 1);

Presumo que a falha esteja no php://input, porque para qualquer ficheiro <80MB funciona perfeitamente.

O código é este:

$maxsize = getMaxFileSize();
$finalfile = $uploadpath . $finalname;
$putdata = fopen("php://input", "r");
$fp = fopen($finalfile, "w");
$filesizecalc = 0;
while ($data = fread($putdata, 1024)) {
	fwrite($fp, $data);
	$filesizecalc = $filesizecalc + 1024;
}

fclose($fp);
fclose($putdata);
if ($filesizecalc <= $maxsize) {
	addFile($_SESSION['userdata']['userid'], $finalname);
	echo "$fn uploaded";
} else {
	unlink($finalfile);
}
exit();

Defino também as seguintes variáveis num include que está no inicio do ficheiro anterior:

ini_set('memory_limit', '1024M');
ini_set('upload_max_filesize', '1024M');
ini_set('post_max_size', '1024M');
ini_set('max_input_time', 10000);
ini_set('max_execution_time', 10000);

Agradeço qualquer ajuda  :wallbash:

Posted

qual o problema em usar o move_uploaded_file ?

Antes de usar esta versão estava a usar:

file_put_contents($uploadpath . $finalname, file_get_contents('php://input'));

E funcionava, mas para ficheiros com >80MB falha na mesma, sem dar erro nenhum nem fazendo o output dos echos..

Posted

Olá Rui,

Relativamente ao código:

ini_set('memory_limit', '1024M');
ini_set('upload_max_filesize', '1024M');
ini_set('post_max_size', '1024M');
ini_set('max_input_time', 10000);
ini_set('max_execution_time', 10000);

O funcionamento do mesmo depende da versão PHP que tenhas...

... mas posso adiantar-te que para versões mais recentes do PHP (PHP >= 5.x) essas linhas não vão funcionar (pelo menos todas) correctamente.

Como podes saber? Eis um exemplo... acede a http://pt.php.net/manual/en/ini.core.php#ini.sect.data-handling

A coluna changeable diz-te como alterar em runtime (na versão actual) e a coluna changelog diz-te - caso se verifique - em que versões houve alterações 😛

Por exemplo, na post_max_size, deverás abrir o .htaccess e colocar:

php_value post_max_size "1024M"

Penso eu...

Posted

Também me avisaram isso no stackoverflow e já pedi ao host para mudar tudo.

Neste momento todas as variáveis que importam estão em valores altos, e o script continua sem funcionar.

Já tentei com file_put_contents, com o copy e com o stream_copy_to_stream e todas funcionam para ficheiros pequenos, mas com ficheiros grandes não faz ouput de nada, nem faz upload do ficheiro :\

Posted

RuiGomes,

Estás a usar o atributo enctype="multipart/form-data" no teu <form> ?

Sim, mas estou a processar os ficheiros via ajax, envio o file com um xhr.send(file).

Entretanto depois de perder horas com isto acabei por mudar o ajax para enviar o ficheiro como $_FILES['ficheiro'] e já funciona tudo perfeitamente.

Posted

Olá RuiGomes,

Vê este link :: http://www.html5rocks.com/en/tutorials/file/xhr2/#toc-send-formdata :: É capaz de te dar algumas ideias sobre como enviar o ficheiro.

Vê também este, referente a como trabalhar com o php://input e com o XHR2 :: http://lenss.nl/2010/01/drag-drop-uploads-with-xmlhttprequest2-and-php/

Finalmente, eis também um exemplo de uso do send ( e nao sendAsBinary)+ :: http://www.sitepoint.com/html5-ajax-file-upload/

Abraço e continuação de um bom trabalho

Posted

O código que eu usei foi esse do sitepoint, claro que com bastantes alterações.

Agora está a funcionar perfeitamente, e não vejo desvantagem em enviar o ficheiro pelo $_FILES em vez de pelo php://input.

Entretanto vou dar uma vista de olhos por esses links só por curiosidade, obrigado 😄

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.