security - titulo - como eliminar un documento subido a turnitin
Securly descargar el archivo dentro del navegador con el nombre de archivo correcto (5)
Estoy trabajando en un sitio web que tiene un área segura que está disponible para los usuarios solo después de que hayan iniciado sesión. En esta área hay una página con enlaces a documentos PDF que se pueden descargar. Los documentos físicos están fuera del directorio raíz del sitio web. Los enlaces a los documentos pdf se ven así:
index.php? page = secure-area / download & file = protected.pdf
Que ejecuta lo siguiente (nota: sé que esta es la manera de forzar una descarga en lugar de abrir el archivo dentro del navegador):
// check security, get filename from request, prefix document download directory and check for file existance then...
header(''Content-Type: application/pdf'');
header(''Content-Disposition: attachment; filename="'' . basename($file) . ''"'');
header(''Content-Transfer-Encoding: binary'');
header(''Content-Length: '' . filesize($file));
header(''Connection: Close'');
set_time_limit(0);
readfile($file);
Esto funciona bien pero en Firefox 3 e Internet Explorer 7 (no lo he probado con ningún otro navegador) no abriré este archivo dentro del navegador, ambos muestran el cuadro de diálogo de descarga (como se esperaba). Si selecciono Abrir en lugar de Guardar, el documento se descarga y Adobe Reader se inicia fuera del navegador para procesar el documento.
El problema que tengo es descargar el archivo dentro del navegador y tener el nombre de archivo predeterminado correcto si está guardado.
Me gustaría que el documento se abra en el navegador. Una forma de hacerlo es usar el encabezado "Content-Disposition: inline;" pero esto significa que no puedo especificar un nombre de archivo (porque parece que el navegador lo ignora). El problema al hacer esto es cuando guardo el documento, el nombre predeterminado es el de la URL, no el nombre del archivo del documento pdf:
http___example.com_index.php_page=secure_area_download&file=protected.pdf
¿Cómo puedo obtener Firefox e Internet Explorer para abrir el documento dentro del navegador y proporcionar el nombre de archivo predeterminado correcto para guardar?
Intenta usar
Content-Disposition: inline;
Le está diciendo que haga eso usando Content-disposition: attachment. Intenta usar Content-disposition: inline.
Finalmente he encontrado una solución para este problema.
Aunque el RFC 2183 muestra que un parámetro de nombre de archivo puede usarse tanto para el archivo adjunto como para el campo de cabecera Content-Disposition, parece que los navegadores ignoran el parámetro del nombre de archivo cuando se usa en línea, pero intentan averiguar en qué se debe basar el nombre del archivo la URL Si la URL no tiene cadena de consulta, la parte de la URL que sigue a la última / parece ser utilizada como el nombre del archivo.
He cambiado los enlaces que descargan los documentos PDF protegidos para utilizar URL agradables que no contienen una cadena de consulta y usar mod_rewrite con un archivo .htaccess para convertir esas buenas URL para ejecutar el script correcto con los parámetros correctos:
Antiguo enlace:
index.php?page=secure-area/download&file=document.pdf
Nuevo enlace:
file/secure-area/download/document.pdf
.htaccess:
RewriteEngine On
RewriteRule ^file/secure-area/download/(.*)$ index.php?page=secure-area/download&file=$1 [L]
El script utilizado para enviar el archivo es el mismo que el utilizado anteriormente (observe que el ejemplo de la pregunta utiliza Content-Disposition: archivo adjunto en lugar de Content-Disposition: en línea para mostrar navegadores guardando el documento con el nombre de archivo correcto cuando no está en línea).
// check security, get filename from request, prefix document download directory and check for file existance then...
header(''Content-Type: application/pdf'');
header(''Content-Disposition: inline; filename="'' . basename($file) . ''"'');
header(''Content-Transfer-Encoding: binary'');
header(''Content-Length: '' . filesize($file));
header(''Connection: Close'');
set_time_limit(0);
readfile($file);
Ahora el documento PDF se abre dentro del navegador y cuando se guarda el nombre de archivo predeterminado es
document.pdf
y no
http___example.com_index.php_page=secure_area_download&file=document.pdf
IE 7 convierte espacios en el nombre de archivo a + y comillas simples a% 27 cuando se guardan (Firefox no), me gustaría evitar que esto ocurra pero, por el momento, estoy contento con lo que tengo.
No, lo que está diciendo es que no es posible especificar el nombre del archivo cuando se usa ''Content-disposition: inline''. ''Nombre de archivo'' solo se usa cuando se utiliza ''Content-disposition: attachment'', como en su primer ejemplo. Esto da como resultado que el documento se descargue con el nombre de archivo correcto. Sin embargo, lo que intenta lograr esta solución es un documento que se traduce INLINE, que cuando se descarga desde el navegador usa el nombre de archivo correcto, en lugar del nombre del script.
¿Hay alguna otra forma de especificar el nombre del archivo cuando se usa ''en línea'' que no sea la reescritura url? La página que he escrito para hacer documentos toma una ID de base de datos, por lo que volver a escribir sería más difícil, creo (el nombre de archivo debería consultarse desde la base de datos).
Content-disposition:inline
se puede usar con el nombre del archivo. Pero solo algunos navegadores entienden y siguen esto. El efecto se ve solo cuando guarda el nombre del archivo usted mismo, se usará el nombre de archivo que defina con la disposición del contenido.