Foros del Web » Programando para Internet » PHP »

Error Al Forzar Descarga

Estas en el tema de Error Al Forzar Descarga en el foro de PHP en Foros del Web. Hola a todos. Tengo un problemilla, resulta que estoy forzando la descarga de archivos jpg utilizando las cabeceras y me funciona bien. Resulta que cuando ...
  #1 (permalink)  
Antiguo 06/06/2005, 04:48
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años
Puntos: 0
Error Al Forzar Descarga

Hola a todos.

Tengo un problemilla, resulta que estoy forzando la descarga de archivos jpg utilizando las cabeceras y me funciona bien. Resulta que cuando bajo el archivo jpg después lo abro y me dice que no es correcto. Este es mi codigo:

<?
$id = $_GET[id];

$file =file( "fotos/".$id);
$file2 = implode("", $file);
header("Content-Type: application/image/jpeg");
header("Content-Disposition: attachment; filename=$id\r\n\r\n");
header("Content-Length: ".strlen($file2)."\n\n");
echo $file2;
?>

$id es el nombre del archivo jpg que lo paso por GET.

A ver si me podeis hechar una mano porque ya me he leido todo lo referente a forzar descargas en el foro pero nadie habla sobre bajarse algo y que luego el jpg no abra bien.

Gracias por adelantado.
  #2 (permalink)  
Antiguo 06/06/2005, 07:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Las cabeceras HTTP .. se indican como una "cadena" (que "lanzas" por el uso de header() desde PHP) pero, se han de separar cada una por un salto de línea y o retorno de carro (\n o \n\r) ..

En tu caso .. en algunos casos usas un montón de \n\r .. y en otros no .. Por lo demás .. no sé que hace referencia ese "ID" .. donde tienes tu archivo en sí? es un archivo que leer del sistema de archivos? .. (que extensión)? .. tienes tu archivo en una BD? (sólo la referencia del nombre del archivo o en binario el archivo en un campo?)

La cabecera que indica el formato MIME del archivo no es correcta tampóco .. o es img/jpeg u otra para formar la descarga.

Código PHP:
<?
$id 
$_GET['id'];

$file =file"fotos/".$id); // tiene extensión tu archivo?
// $file2 = implode("", $file); // para qué lo usas? 
header("Content-Type: image/jpeg\n\r"); 
header("Content-Disposition: attachment; filename=".basename($file)."\n\r"); 
header("Content-Length: ".filesize($file)."\n\r"); 
readfile($file); // realmente es un archivo ?
?>
Debes aclarar donde tienes tus archivos y como haces referencias a ellos .. EL código que presentas no aclara mucho tu situación (por el "pupurí" de cosas que haces).

Un saludo,
  #3 (permalink)  
Antiguo 06/06/2005, 08:39
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años
Puntos: 0
Muchas gracias Cluster, ya me funciona todo.

Todo ese popurrí de cosas que has visto ahí es un código que he cogido de un post de este foro que resulta que al parecer no funciona, lo único que yo añadi es el poner el id, que en este caso solo era el nombre del archivo en cuestión.

bye y gracias
  #4 (permalink)  
Antiguo 11/06/2005, 20:43
Avatar de [HH]KaoS  
Fecha de Ingreso: diciembre-2004
Ubicación: Nerja, Málaga (España)
Mensajes: 216
Antigüedad: 19 años, 3 meses
Puntos: 6
chicos yo tengo otro problema, a mi me descarga bien pero se ve q no indico bien q es uin wmv y no me lo reproduce el WMP

Tengo el codigo:

$enlace y $file vienen por get
Código:
	$enlace .= $file;
	header ("Content-Disposition: attachment; filename=\"$file\"");
	header ("Content-Type: application/video/x-ms-wmv ");
	header ("Content-Length: ".filesize("$enlace"));
	readfile("$enlace");
  #5 (permalink)  
Antiguo 12/06/2005, 11:03
Avatar de [HH]KaoS  
Fecha de Ingreso: diciembre-2004
Ubicación: Nerja, Málaga (España)
Mensajes: 216
Antigüedad: 19 años, 3 meses
Puntos: 6
plzzzzzzz ayuda,q los post van bajando xD
  #6 (permalink)  
Antiguo 12/06/2005, 19:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
header ("Content-Type: application/video/x-ms-wmv ");

En principio .. que te abra tu Windows Media Player .. u otro reproductor para ese tipo de archivos depende de la configuración de tu S.O. (del "cliente" no del servidor).

Ahora .. el formato MIME para esos "wmv" es:
video/x-ms-wmv

Te recomiendo usar google cuando no sepas que formato MIME es tu archivo para adecuar su cabecera HTTP:

http://msdn.microsoft.com/library/en.../html/mime.asp


Un saludo,
  #7 (permalink)  
Antiguo 13/06/2005, 08:54
Avatar de [HH]KaoS  
Fecha de Ingreso: diciembre-2004
Ubicación: Nerja, Málaga (España)
Mensajes: 216
Antigüedad: 19 años, 3 meses
Puntos: 6
Gracias Cluster por tu respuesta enserio.

Ya ya se q depende como tenga configurado el server, era para poner un ejemplo puntual. Suelo mirar antes por google, de exo pasa algunas horas antes buscando y tb dentro de este foro y alguno más a ver si ya estaba resuelta mi duda, pero esq no sabia q la palabra clave era MIME :).

De todas formas sigue persistiendo el mismo fallo:
Código:
<?php 
	header ("Content-Disposition: attachment; filename=\"$file\"");
	header ("Content-Type: video/x-ms-wmv");
	header ("Content-Length: ".filesize("$enlace"));
	readfile("$enlace");
?>
Al intentar reproducirlo me dice:
"El archivo que intenta reproducir tiene una extension que no coincide con el formato del archivo.Si lo reproduce puede producir un comportamiento inesperado"

(Pero la extension es wmv) Así que algo raro debe de meter en las cabeceras del archivo o algo así,no?
  #8 (permalink)  
Antiguo 13/06/2005, 09:03
Avatar de [HH]KaoS  
Fecha de Ingreso: diciembre-2004
Ubicación: Nerja, Málaga (España)
Mensajes: 216
Antigüedad: 19 años, 3 meses
Puntos: 6
Por fin! di con el problema, se me olvido decir que en algunos casos las descargas eran a servidores externos, por lo que la funcion filesize() no funcionaba (al abrir el *.wmv con el notepad encontre un warning en esa funcion).

Por lo que opté por kitar :
header ("Content-Length: ".filesize("$enlace"));
(ya q imagine q solo servia de titulo informativo para dar a conocer el tamaño)
y ahora ya funciona, al descargar se ve bien :D, aunque ahora d antemano no se sabe el tamaño del archivo ya tengo yo en la pagina de la descarga el tamaño.

Muchas gracias por la ayuda!!
Un cordial saludo,
KaoS
  #9 (permalink)  
Antiguo 14/06/2005, 19:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
La cabecera HTTP que indicas por ejemplo se usa para informar al "cliente" de cuantos datos se le van a enviar y así este pueda calcular cierto tiempo de descarga aproximado en función a los bytes que va recibiendo. Incluso hay más cabeceras HTTP para hacer la opción "resume" (si se corta el archivo .. se retoma su descarga cuando esté disponible) (en las FAQ's del foro PHP tienes una al respecto).

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 00:36.