2009-11-26 9 views
6

Quiero cambiar el nombre del archivo cuando el usuario lo descarga.Cambiar el nombre de los archivos al descargarlo

En este momento, estoy enviando encabezados content-disposition y content-length y luego envío el archivo al usuario con la función fpassthru PHP.

pero hay 3 problemas con este método:

  1. Si estoy enviando grandes (por encima de 3-4Gb) archivos de esta manera, entonces mi script PHP se ejecuta demasiado tiempo y puede ser matado por tiempo de espera.
  2. Si el usuario cancela la descarga, la secuencia de comandos PHP continúa leyendo y enviando el archivo
  3. Si el usuario pausa la descarga, no podrá reanudarla más tarde.

¿Existe alguna forma más sencilla de cambiar el nombre de los archivos al descargar?

Respuesta

12
<?php 
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'); 
?> 
  1. El archivo se ofrecerán para su descarga como "descarga.pdf", mientras que su nombre original era "original.pdf".

Pseudo código

while(1) { 
    Echo "..."; //<-- send this to the client 
    if (connection_status()!=0){ 
    die; 
    } 
} 
  1. Puede detener el script PHP si un usuario cancela el navegador mediante el uso de connection_status()

  2. HTTP no puede volver a conectar una conexión cerrada ¡FTP puede!

+0

Genial. Eso es exactamente lo que hago ahora, solo usando la función fpassthru en lugar de readfile. ¿Pero cómo su solución ayudará a resolver esos tres problemas que señalé en mi pregunta? – Boffin

1

Para el tercer punto, podría intentar usar los encabezados HTTP Range.
Si el usuario tiene un cliente de descarga con capacidad de reanudar, debe enviar esos encabezados a su secuencia de comandos, que puede utilizar para identificar exactamente qué partes del archivo desea enviar.

12

Desde que se hizo la pregunta, algún tiempo ha pasado y html5 nos dio un enfoque diferente para esto:

<a href="someWeiredFileName.rar" download="coolFilename.rar">Download</a> 

El attributedescarga (learn more) define el valor por defecto filename para almacenar el archivo en el la computadora del cliente (¡él todavía podrá cambiarla!).

Nota: esto no afectará a nada en su servidor.

+0

Interesante, Esto podría evitar una gran cantidad de código del lado del servidor, pero no funciona en el heredado Old Chap IE. –

+0

@RienNeVaPlus, funciona bien para el sistema de Windows pero no para el sistema Linux. ¿Alguna idea de cómo podemos lograrlo para el sistema Linux? – kalidasan

Cuestiones relacionadas