Foros del Web » Programando para Internet » PHP »

tengo un problema con header()

Estas en el tema de tengo un problema con header() en el foro de PHP en Foros del Web. Hola a tod@s, después de mucho navegar por foros a ver si aki me ayudais. Bueno, mi problema es el siguiente: Estoy haciendo prácticas programando ...
  #1 (permalink)  
Antiguo 05/06/2003, 06:30
Avatar de jama  
Fecha de Ingreso: junio-2003
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 0
tengo un problema con header()

Hola a tod@s, después de mucho navegar por foros a ver si aki me ayudais.
Bueno, mi problema es el siguiente:

Estoy haciendo prácticas programando en php (o al menos lo intento) y ya he dejado el proyecto listo o casi, pq me faltan dos cosillas y una es que tengo un buscador y los resultados son archivos que quiero me los abra el navegador directamente sin que salga el poup up de abrir o guardar, os mando el código y que alguien me lo corrija (si se puede) o bien me explique la forma de hacerlo. Gracias de antemano:

/* <?php
// array con tipos mimes
$mimes = array( 'doc' => 'application/x-msword',
'xls' => 'application/vnc.ms-exel',
'rtf' => 'application/rtf',
'ps' => 'application/postscript',
'pdf' => 'application/pdf',
'mdb' => 'application/msaccess',
'ppt' => 'application/vnd.ms-powerpoint',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'exe' => 'application/application/x-msdos-program',
'zip' => 'application/zip',
'tgz' => 'application/gzip',
'txt' => 'text/plain',
'tif' => 'image/tiff'
);

function getmime($dir_file) {
global $mimes;
// compobamos la extensión del archivo.
$ext = substr(strrchr($dir_file,"."),1);
if (in_array($ext,array_keys($mimes))) {
// echo $ext;
// echo $mimes[$ext];
$ret[0] = $ext;
$ret[1] = $mimes[$ext];
}
else {
$ret[0] = "none";
$ret[1] = "application/octet-stream";
}
//print_r($ret);
return $ret;
}

$type = Array();
$type = getmime($dir_file);
$nombre_archivo=basename($dir_file);
header("Cache-control: no-cache, must-revalidate");
header("Content-type: octet/stream ");
header("Content-disposition: filename=".$nombre_archivo);
passthru($dir_file);
?> */


La vble dir_file es el path del fichero.
  #2 (permalink)  
Antiguo 05/06/2003, 06:58
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

El problema de tu codigo es que no identifica el contenido que manda al navegador. Con esta linea:
Código PHP:
header("Content-type: octet/stream "); 
le estas diciendo que le mandas solo unos cuantos bytes, no le dices que tipo de fichero es. Sustituyela por:
Código PHP:
header("Content-type: $type[1]"); 
En $type[1] has obtenido el tipo MIME (el tipo del fichero). Con esto le comunicas al navegador que el fichero es de tal tipo, y el navegador hara con los datos lo que este programado hacer. Si esta configurado para mostrarlo dentro del navegador (plugins para PDF, imagenes,...), lo mostrara. Si esta configurado para abrirlo con una aplicacion externa, lo hara. Si no reconoce el tipo de fichero, mostrara el dialogo abrir/guardar.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 06/06/2003, 02:01
Avatar de jama  
Fecha de Ingreso: junio-2003
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 0
no me he dado cuenta, pero lo que está puesto es algo que hice después de ver bastante documentación y visitar algún que otro foro. El original tiene o tenía tu sugerencia, y no me daba el resultado deseado. De todas formas, decirte que (esto no lo entiendo) donde pone:

header("Content-disposition: filename=".$nombre_archivo);

enl $nombre_archivo tenía $dir_file, y si lo comentaba obtenia resultado con los pdf y jpg, pero .xls y .doc lanzaban la aplicación y lo que me mostraba el IE era el script index.php, y los .txt salían deformados (estos sin la línea comentada salen bien) no se???

Hola, edito para decir que con esto:

$type = Array();
$type = getmime($dir_file);
$nombre_archivo=basename($dir_file);
header("Cache-control: no-cache, must-revalidate");
header("Content-type:". $type[1]);
header("Content-disposition: inline; filename=". $nombre_archivo);
passthru("cat $dir_file");

Ahora parece que resulta, pero con los xls y doc me sigue pasando lo mismo.

Última edición por jama; 06/06/2003 a las 03:22
  #4 (permalink)  
Antiguo 06/06/2003, 04:01
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Es que tu desde PHP no puedes controlar lo que hace el navegador con el fichero que le mandas. Por ejemplo, prueba con un PDF en un equipo que no tenga instalado el plugin de PDF en el navegador. Te saldra la ventana de abrir/guardar. Tu tienes configurado tu navegador para que los xls y los doc se abran abriendo la aplicacion correspondiente. No lo puedes controlar. PHP no puede controlar el cliente. En el protocolo HTTP solo se especifica el significado de las cabeceras. En este caso le estas informando al navegador que le mandas un fichero del tipo doc, y con esa informacion el navegador actuara tal como este configurado. Y tampoco depende del tipo de navegador. Dos IE pueden estar configurados de distinta forma, pueden tener distintos plugins.

Asi que no puedes hacer nada para asegurar un comportamiento uniforme en el lado del cliente. Si es un requisito del proyecto, documenta de que solo funcionara con x tipos de ficheros y aun asi dependera de la configuracion del navegador.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 06/06/2003, 04:29
Avatar de jama  
Fecha de Ingreso: junio-2003
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 0
Gracias Josemi, se que tienes razón con lo del navegador, pero lo que me raya es que me lance el word y en vez de mostrarme el contenido del documento, me muestre como contenido la página index.php, y por eso creo que con el word no es por los plugins, es que me da la sensacion que el contenido se lo come (y no se quien )
De todas, creo que lo voy a dejar aparcado una o dos horas para no quemarme, decir que de todos los mime del array todos hacen ya lo que quiero salvo los .xls, .doc, .rtf y .mdb, y creo que los que más me interesan que funcionen son los .doc

Bueno, lo dicho gracias, voy a pelearme un rato con el treemenu, si consigo que se vean los .doc ya lo pondré.
  #6 (permalink)  
Antiguo 06/06/2003, 05:31
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
¿Dices que te abre index.php en el word? Prueba a poner attachment en lugar de inline en el content-disposition:
Código PHP:
header("Content-disposition: attachment; filename="$nombre_archivo); 
Y mira si te abre el fichero.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 06/06/2003, 05:44
Avatar de jama  
Fecha de Ingreso: junio-2003
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 0
Ya eso lo probé, pero el resultado que obtengo no es el deseado por mi jefe, ya que con attachment me salta el poup up de abrir o guardar, y él no quiere eso, y no se porqué, ya que así si funciona el doc, pero no el pdf, este me obliga a descargarlo para verlo, y sim embargo como yo lo tengo no, estoy por poner un "if" y dejar attachment para los doc y compañia.
Gracias de nuevo.
  #8 (permalink)  
Antiguo 06/06/2003, 05:55
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Pues si, pon el if usando el valor de $type[1]. Aun asi, ahora que me doy cuenta, no me suenan alguno de esos MIMETypes (el array). Estoy mirando ahora el fichero que viene con el Apache y ni el del word ni el de excel coinciden. En el fichero son 'application/msword' y 'application/vnd.ms-excel' respectivamente. Prueba a cambiar esos valores en el array. En este link http://www.isi.edu/in-notes/iana/ass...es/media-types hay una lista de los MIME, pero no se hasta que punto esta actualizada.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #9 (permalink)  
Antiguo 06/06/2003, 06:21
Avatar de jama  
Fecha de Ingreso: junio-2003
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 0
no, ni cambiando eso
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:56.