Jump to content
RuiGomes

php://input falha com ficheiros grandes

Recommended Posts

RuiGomes

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:

Share this post


Link to post
Share on other sites
RuiGomes

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..

Share this post


Link to post
Share on other sites
RuiGomes

Não consegui implementar essa solução..

Devo incluir o php://input no move_uploaded_file como? Com fopen do phpinput?

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

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 :P

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

php_value post_max_size "1024M"

Penso eu...

Share this post


Link to post
Share on other sites
RuiGomes

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 :\

Share this post


Link to post
Share on other sites
HappyHippyHippo

pode ser script timeout por ser um ficheiro demasiado grande ... como determinar se é esse o problema : vê nas ferramentas de desenvolvimento do teu browser


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

RuiGomes,

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

Share this post


Link to post
Share on other sites
RuiGomes

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.

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

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

Share this post


Link to post
Share on other sites
RuiGomes

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 :D

Share this post


Link to post
Share on other sites

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.