¿Cómo enviar un archivo al navegador como archivo adjunto si el archivo significado reside en un servidor de terceros (sin descarga o transmisión previa)?Enviando archivo a un navegador como archivo adjunto
Respuesta
Si desea proporcionar archivos que se manejan regularmente por el navegador (imágenes, html, ...), tendrá que añadir una cabecera para cambiar el tipo MIME con algo como:
header("Content-Type: application/force-download; name=filename");
Si usted no tiene acceso al servidor de terceros, que no tienen otra opción para descargar el archivo usted mismo para proporcionar al usuario mediante la adición de la cabecera
Mejor uso * application/octet-stream *. – Gumbo
http://php.net/manual/en/function.header.php#example-3655
Si desea que se le solicite al usuario que guarde los datos que está enviando, como un archivo PDF generado, puede utilizar el encabezado »Content-Disposition para proporcionar un nombre de archivo recomendado y forzar al navegador a mostrar el cuadro de diálogo de guardar.
<?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');
?>
esto enviaría un archivo almacenado localmente, por favor vuelva a leer la pregunta en cuestión. – RobertPitt
De otro servidor sin necesidad de descargar a su servidor:
header('Location: http://thirdparty.com/file.ext');
sin necesidad de descargar el archivo localmente usted no tiene ninguna autorización en el servidor externo, lo que tiene que decirle al navegador qué hacer, por lo tanto, el encabezado de redirección, le indicará al servidor que vaya directamente a la url proporcionada, cargando así la descarga.
Desde el servidor, debe hacer:
if (file_exists($file))
{
if(false !== ($handler = fopen($file, 'r')))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file)); //Remove
//Send the content in chunks
while(false !== ($chunk = fread($handler,4096)))
{
echo $chunk;
}
}
exit;
}
echo "<h1>Content error</h1><p>The file does not exist!</p>";
fopen requiere 2 parámetros, el segundo debe ser el modo, en este caso "r" para leer –
fopen + fread by chunks no es una buena opción, es demasiado lento. Use readfile ($ file) después de los encabezados para acelerar. – Asaelko
Como los otros han dicho, hay que establecer la cabecera Content-disposition de la respuesta al archivo solicitud de descarga Sin embargo, has dicho que el archivo está en un servidor de terceros. A menos que tenga control sobre cómo el servidor envía el archivo, no puede cambiar la forma en que el navegador recupera de ese servidor.
Sin embargo, puede realizar un proxy del archivo para que su servidor descargue el archivo y luego lo pase al cliente con los encabezados correspondientes. Esto significa que ha duplicado su factura de ancho de banda, ya que tiene que descargar el archivo Y subirlo al mismo tiempo.
lo dijo sin descarga o transmisión previa. – RobertPitt
@RobertPitt: ¿Magia, entonces? – drudge
No del todo, el uso de la función de redirección creará la * ilusión * de que el archivo se está descargando de su servidor. – RobertPitt
Solo una nota para aquellos que enfrentan problemas con los nombres que contienen espacios (por ejemplo, "test test.pdf").
En los ejemplos (99% del tiempo) puede encontrar el encabezado ('Content-Disposition: attachment; filename ='. Basename ($ file));
pero la forma correcta de establecer el nombre de archivo es citando (comillas dobles): header ('Content-Disposition: attachment; filename = "'. Basename ($ file). '"');
Algunos navegadores pueden trabajar sin cita, pero seguro que no es Firefox y como explica Mozilla, la cotización del nombre de archivo en el contenido-disposición está de acuerdo con el RFC http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download
- 1. ¿Cómo subir un archivo (archivo adjunto) desde el navegador?
- 2. enviando un archivo adjunto de correo electrónico usando TCPDF
- 3. Enviar archivo cargado como archivo adjunto
- 4. Enviar un archivo como archivo adjunto en el objetivo c
- 5. Transmitir como un archivo adjunto a System.Net.Mail es 0 bytes
- 6. Agregar un archivo adjunto a .NET Email
- 7. ¿Enviando un correo electrónico con un archivo adjunto a través de GMailSender?
- 8. Chrome está malinterpretando un archivo adjunto como documento
- 9. ¿Guarda un PDF de gambas como archivo adjunto de Paperclip?
- 10. borrar el archivo adjunto
- 11. Enviando generado dinámicamente archivo javascript
- 12. imap - obtener archivo adjunto
- 13. ¿Cómo enviar por correo electrónico un archivo Django FileField como un archivo adjunto?
- 14. SharpZipLib crear un archivo con una cadena en la memoria y descargarlo como un archivo adjunto
- 15. Android Bluetooth enviando archivo
- 16. Agregar un archivo adjunto a un correo electrónico usando C#
- 17. Enviando archivo en fragmentos a HttpHandler
- 18. paperclip + ActionMailer - ¿Agregar un archivo adjunto?
- 19. Agregar un archivo adjunto a la solicitud SOAP
- 20. ¿Cómo subir un archivo adjunto a la wiki de GitHub?
- 21. ¿Cómo enviar pdf generado por TCPDF como archivo adjunto SwiftMailer
- 22. Enviando un archivo a través de HTTP PUT en PHP
- 23. Cómo puedo mostrar una imagen y agregarla como archivo adjunto a un correo electrónico
- 24. ¿Cómo enviar el archivo pdf generado como archivo adjunto en el correo electrónico desde C#?
- 25. EPPlus con MemoryStream como archivo adjunto de correo electrónico: el archivo está vacío
- 26. ¿Puede un cuerpo de correo electrónico HTML hacer referencia a un archivo enviado como archivo adjunto (en el mismo correo electrónico)?
- 27. Cómo agregar una imagen a un elemento de trabajo TFS; como una imagen, no como un archivo adjunto
- 28. Cómo implementar Gmail como archivo de carga/archivo adjunto utilizando HTML 5
- 29. Cómo implementar Content-Disposition: archivo adjunto?
- 30. Envío de cuerpo simple mensaje + archivo adjunto usando Linux mailx
No hay manera de lograr eso. No tiene influencia sobre el manejo de recursos remotos. Y los clientes HTTP no admiten cargas útiles 'mensaje/cuerpo externo'. – mario