2011-02-04 7 views
8

Tengo un script PHP a la que subo las imágenes JPEG (a través de un formulario HTML). Puede ver el código here, pero intentaré presentar las partes relevantes en esta publicación. El formulario se declara así:archivos JPEG subidos a un script PHP llegan corrupta - pero no todo el tiempo

<form action="adm_addphoto.php" method="POST" enctype="multipart/form-data" name="myform"> 

El campo MAX_FILE_SIZE formulario se establece en 5 MB:

<input type="hidden" name="MAX_FILE_SIZE" value=5242880> 

Las imágenes que desea cargar son aproximadamente 3 MB de tamaño.

Una vez que se ha subido, se enciende el archivo de imagen en un archivo JPEG GD:

$filename = $_FILES['file']['tmp_name']; 
$myImage = imagecreatefromjpeg($filename); 

veces la carga funciona bien, ya veces imagecreatefromjpeg emite advertencias sobre el JPEG ser corrupto. Por ejemplo (saltos de línea adicionales para facilitar la lectura):

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 
     gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 
     47 extraneous bytes before marker 0xd9 in 
     /path/adm_addphoto.php on line 97 

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 
     '/tmp/phpwlSS9x' is not a valid JPEG file in 
     /path/adm_addphoto.php on line 97 

La cosa es que esto no sucede de forma fiable. Es decir, si pruebo la misma imagen varias veces seguidas, a veces se cargará correctamente y, a veces, habrá errores. Y dentro de los intentos que resultan en errores, los detalles del mensaje de error también variarán. (Con la foto en particular que produjo los mensajes anteriores, el número de "bytes extraños" es a veces 47, a veces 20, ocasionalmente 68.)

¿Qué podría estar causando que los archivos lleguen corruptos en algunos intentos pero no en otros?

PS. Sé que hay una configuración de ini que le dice a GD que intente trabajar duro con archivos JPEG corruptos. Pero ese no es el punto, quiero saber por qué el resultado de la carga es inconsistente.

PPS. Estos son los valores de algunos ajustes PHP ini-posiblemente relevantes:

memory_limit .......... 128M 
post_max_size ......... 8M 
file_uploads .......... On 
max_file_uploads ...... 20 
upload_max_filesize ... 128M 
upload_tmp_dir ........ no value 

ACTUALIZACIÓN: He añadido el código a la función echo el tamaño y la suma de comprobación MD5 del archivo una vez que se ha subido. El tamaño es siempre el tamaño de archivo correcto (el tamaño de mi copia local del archivo). El MD5, sin embargo, varía entre intentos. Cuando el MD5 es correcto (coincide con el MD5 de mi copia local), no hay ningún mensaje de error. Cuando hay un mensaje de error, el MD5 siempre es diferente de lo esperado. Además, esto es solo una diferencia percibida, pero los errores parecían estar ocurriendo más frecuentemente anoche que esta mañana: solo una minoría de las transferencias de esta mañana resultó en un error.

Éstos son algunos archivos "malo" (curiosamente, había un par de subidas que le dio una suma de comprobación MD5 diferente a que los errores esperados, pero no produjeron):

    Correct MD5: f7b9587f39c7332e62a08adf34cefbd0 
----------------------------------------------------------------- 
      38 extraneous bytes: 2a28c46079071d9d2e2fd49865b35d59 
           ce1c69f798953b201dcc35f85f3b29b4 
           b013a0428a71adff674a46e92372d46b 
      71 extraneous bytes: a271928f3559b6deaa19804704b5bcb3 
      92 extraneous bytes: cab2a10ad8535addaca3b19bcb607a30 
premature end of data segment: 4514d39db1d94ab691d6da26c0832cdb 
        No error (!): 83b2e3624ddcfdeb3efc10be81631916 
           07d0a97b21d423fdeb4c6f88d76f8cd3 

ACTUALIZACIÓN: En respuesta a Andre y Pekka: Aquí hay enlaces a dos versiones de la misma imagen. This one es la copia original de la imagen, tal como está almacenada en mi máquina; Lo cargué de la manera en que normalmente cargo archivos en mi alojamiento web, es decir, utilicé un cliente FTP. This one es la misma imagen, cargada usando mi script (pero con una línea agregada para moverlo a esa ubicación usando move_uploaded_file()). El mensaje de error en esa carga fue "Datos JPEG corruptos: 30 bytes extraños ...". Notará que la parte inferior de la imagen parece incorrecta. Me disculpo por el gran tamaño de las imágenes, pero solo puedo usar ejemplos del tipo de imágenes que me causan problemas.

  • Debo dejar en claro que esta es una imagen diferente a la que utilicé para las sumas de comprobación MD5 anteriores. No pensé usar la misma imagen.

ACTUALIZACIÓN: Usando las dos imágenes que he vinculado anteriormente, encontré las diferencias entre los dos archivos. Hay dos secuencias de 32 bytes que son diferentes en una imagen de la otra. Los archivos son por lo demás idénticos.

n.b. the first character is numbered as character 1, not character 0 

n.b. 2116624 and 2493456 are both 16 modulo 32. 
    The difference between them is 368 * 1024. 

character 2116624 through line 2116655 (32 characters): 

    original image: 

    3c bc 20 19 eb 93 cd 34 db 93 68 7c 8d 5e 37 d4 
    d3 84 91 70 7e 7c 82 3e e9 e8 3d eb 2e ff 00 ce 

    bad image: 

    89 c9 54 a6 e5 3d f4 fc 8e 7f 68 d5 47 14 41 f6 
    55 11 7d a6 55 24 a8 e0 f7 a8 a4 43 06 18 c2 c1 

character 2493456 through character 2493487 (32 characters): 

    original image: 

    3d a4 61 37 19 75 63 2e 51 62 ca 07 e0 9e 49 35 
    5d 65 8d 22 01 7f 5e b4 a7 19 3a 7a ef 72 1c e3 

    bad image: 

    4f 99 26 39 6a db d9 cd 3e 5b ec 63 46 3c b4 ef 
    2d b6 30 35 0f 12 a1 b6 9a 11 68 1a 69 07 0c 49 
+0

¿Recibió esos mensajes de error de una entrada de registro? ¿Quién estaba cargando? –

+0

Estoy cargando. Estos errores se enviaron al navegador, porque estoy tratando de solucionar el problema, de modo que he habilitado el informe de errores. – Hammerite

+0

Solo para asegurarse, ¿tiene solo un servidor web por lo que solo hay una configuración php/gd? – Damp

Respuesta

3

¿Está seguro de que no hay ningún problema con su conexión a Internet? ¿Lo has probado desde una conexión diferente o incluso ISP?

+0

Me pondré en contacto con usted cuando haya tenido la oportunidad de probarlo en mi máquina en el trabajo. – Hammerite

+0

Bueno, traté de subir 4 imágenes de mi máquina en el trabajo, 10 veces cada una, y no vi ningún error en absoluto, así que tengo que concluir que es muy probable que sea solo un problema con mi conexión a Internet.Es una pena no poder diagnosticar con mayor precisión cuál es el problema ni hacer nada al respecto. Tendré que subir mis fotos del trabajo, supongo. – Hammerite

0

Es un tramo, pero un posible problema que ocurre es que se está trabajando en el archivo temporal, trate de usar move_uploaded_file para mover el archivo a un lugar que ha especificado, y ver si eso hace ¿diferencia?

+0

Ahora he intentado agregar código que usa move_uploaded_file() para mover el archivo antes de intentar hacer uso de él. No parece hacer ninguna diferencia a los mensajes de error o con qué frecuencia ocurren. – Hammerite

0

En lugar de intentar una conversión en este punto, volcar la información de archivo temporal y comparar el tamaño del archivo, etc.

Debido a la naturaleza aleatoria de esto, es probable que sea algún tipo de problema de transmisión. Probablemente pueda descartar su propio hardware intentando mover un archivo zip de un tamaño decente (por ejemplo) desde la computadora que está ejecutando a otra cosa en la red local (varias veces) y luego ver si el archivo zip pasa la verificación CRC o se corrompe.

Además, ¿está ejecutando un dispositivo de servidor de seguridad que olfatea el tráfico http? (por ejemplo, desenredar)

+0

Agregué al script una línea que hace eco del tamaño del archivo temporal, e intenté subir el archivo varias veces. El tamaño de archivo repetido siempre es el mismo: 2803547, que es el tamaño de la copia del archivo almacenado en mi máquina. Este tamaño de archivo es el mismo independientemente de si los mensajes de error aparecen o no, y sin importar los detalles del error. – Hammerite

+0

Estoy ejecutando Windows Vista SP2. Windows Firewall está habilitado. (Intenté usar Opera, que está habilitado como una excepción en la configuración de Firewall de Windows, y vi el mismo comportamiento). ¡Tengo Avast! Antivirus (edición gratuita) instalado. No tengo un firewall comercial instalado. Me conecto a internet desde mi casa a través de un enrutador de banda ancha. Además: consulte mi actualización a la pregunta, re: sumas de comprobación MD5. – Hammerite

Cuestiones relacionadas