2009-12-01 21 views
5

Dado: Todos los archivos PDF cargados en el servidor tienen prefijos con marcas de tiempo. Más tarde, el usuario puede descargar estos archivos nuevamente. Estos nombres de archivo (feos) nunca volverían a cambiar en el servidor.Cambie el nombre del archivo pdf para descargarlo en vuelo

Pregunta: Cuando doy la opción de descargar un archivo PDF, el nombre del archivo se ve feo y prolongado. ¿Cómo puedo cambiar este nombre a algo sensato, de modo que cuando el usuario descargue este archivo, el nombre no se vea raro?

¿Debo hacer una copia, ya que renombrar el archivo original no es una opción? ¿No sería una sobrecarga adicional para cada archivo descargable? Obviamente, eliminar el archivo copiado sería otro paso adicional.

¿Es posible cambiar el nombre del archivo una vez que el archivo se haya descargado por completo en el lado del cliente?

¿Qué es lo que ustedes chicos sugieren?

Respuesta

10

Algo como esto:

<?php 
// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 
+0

Content-type' debe ser Content-type' , aunque. – jensgram

+0

@jensgram: no distingue entre mayúsculas y minúsculas. – BalusC

+0

@klausbyskov: vea el comentario de BalusC a continuación. según él, ¿no funcionará en IE? – understack

0

El nombre de archivo del contenido servido se define en las cabeceras HTTP. Mire a su alrededor PHP page on headers (también los comentarios) para más información.

1

Es necesario configurar el nombre del archivo deseado en la cabecera Content-Disposition:

$name = 'desiredname.pdf'; 
header('Content-Disposition: attachment;filename="' . $name . '"'); 

Pero por desgracia esto no será recogido por un determinado navegador web desarrollado por un equipo en Redmond. Si también desea que funcione en ese navegador, debe agregar el mismo nombre de archivo que la última parte de la ruta de solicitud. Por ejemplo: http://example.com/pdf/desiredname.pdf.

+0

Creo que técnicamente el parámetro de nombre de archivo no debe estar entre comillas.Si el nombre no contiene espacios ni caracteres divertidos, déjalo sin comillas. – TRiG

+0

@BalusC: esto fue útil como http://stackoverflow.com/questions/698308/why-doesnt-content-disposition-header-work-in-ie-8 this one. Gracias. – understack

0

Hace un tiempo estaba haciendo algo similar, sirviendo archivos a través de php (en mi caso, no para cambiarles el nombre, sino para verificar que la persona que los descargó había iniciado sesión y se le permitía ver esos archivos). Descubrí que las descargas de PDF no funcionaban en IE a menos que también agregara estos encabezados:

header('Pragma: public'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Transfer-Encoding: binary'); 

No estoy seguro de por qué. Experimenta y mira lo que pasa

6

Necesitaba hacer esto para un proyecto reciente y estaba un poco confundido sobre cómo implementarlo, pero lo descubrí poco después de ver la respuesta de Klaus. Para profundizar en la respuesta de Klaus:

1) Cree un archivo llamado, digamos, "process.php". Modifique el código de Klaus para que acepte dos parámetros: el nombre de archivo original y el nuevo nombre. Mi process.php parece:

<?php 
$file = $_GET['file']; 
if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/pdf'); 
    header('Content-Disposition: attachment; filename='.$_GET['newFile']); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
?> 

2) Crear un enlace en su página de usuario orientada hacia el que apunta a la secuencia de comandos del procesador:

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a> 
+0

Si mi archivo se coloca dentro del directorio 'myFiles', ¿cómo puedo establecer la ruta aquí? Estoy un poco confundido ¿Me puedes explicar? –

+0

Encontré eso. Asigné el nombre del archivo como '$ file = 'myFiles/sample.pdf';'. Está funcionando como el encanto ... Gracias por el código ... +1 –

Cuestiones relacionadas