2011-05-24 15 views
8

Estoy tratando de leer una corriente de entrada sin procesar de php usando la entrada php: //. Esto funciona para la mayoría de los archivos, sin embargo, los archivos de más de 4 MB se ignoran en la carga. He establecido post_max_size y upload_max_size en 20M cada uno pensando que resolvería mi problema, pero no fue así. ¿Hay otra configuración de php.ini que deba configurarse o necesito hacer algún tipo de fragmentación? Si es así, ¿cómo voy a hacer eso? Aquí está el código upload.php:limitaciones de tamaño de la corriente de entrada php

$fileName = $_SERVER['HTTP_X_FILE_NAME']; 
$contentLength = $_SERVER['CONTENT_LENGTH']; 

file_put_contents('uploads/' . $fileName, file_get_contents("php://input")); 
+0

FYI ... Estoy enviando el archivo a través de xmlhttprequest, pasando un archivo de objeto a través del método de envío. – srowley

+0

Me di cuenta de esto. Php se estaba quedando sin memoria para poner todo el archivo en el búfer, así que aumenté el límite de memoria con la variable php.ini memory_limit. Funciona, pero no parece ser la mejor solución. Si alguien sabe cómo leer la secuencia de entrada php: // en un archivo en pedazos para que no agote el límite de memoria, ¡por favor hágamelo saber! Gracias – srowley

Respuesta

10

Trate stream_copy_to_stream, que bombea directamente el contenido de la entrada en el archivo sin copiar todo primero en la memoria:

$input = fopen('php://input', 'rb'); 
$file = fopen($filename, 'wb'); 
stream_copy_to_stream($input, $file); 
fclose($input); 
fclose($file); 

Alternativa:

$input = fopen('php://input', 'rb'); 
$file = fopen($filename, 'wb'); 
while (!feof($input)) { 
    fwrite($file, fread($input, 102400)); 
} 
fclose($input); 
fclose($file); 
+0

Lo siento, esto no funciona, los mismos resultados que antes. En este momento, la única forma en que puedo cargar archivos más grandes es establecer memory_limit a un tamaño mayor en el archivo php.ini. Por alguna razón, no puedo modificarlo con ini_set ("memory_limit", "64M"); – srowley

+0

@srowley Eso es raro. Probé con copia de flujo de cientos de MB de '/ dev/random' y el uso de memoria nunca fue superior a 7MB. Según un comentario en la página del manual, 'stream_copy_to_stream' parece portarse mal algunas veces. Publicado la alternativa "manual". Si eso tampoco ayuda, su problema está en otro lugar. – deceze

+0

Estoy realmente confundido ahora ... Su primer método realmente funciona con un archivo 672M, pero no con un archivo de 5M. No sé por qué. – srowley

Cuestiones relacionadas