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
¿Recibió esos mensajes de error de una entrada de registro? ¿Quién estaba cargando? –
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
Solo para asegurarse, ¿tiene solo un servidor web por lo que solo hay una configuración php/gd? – Damp