Quiero enviar un archivo al navegador desde un sitio web utilizando un servicio web. Actualmente estoy leyendo el archivo en una matriz de bytes base64 y devolvéndolo desde el servicio web. Se llama a este servicio web desde un sitio web, y estoy atascado en cómo insertarlo como el archivo original en el navegador. Idealmente, me gustaría leer la matriz de bytes en una secuencia de memoria, y luego simplemente escribirla en la secuencia de respuesta si es posible para que el usuario final simplemente descargue el archivo.Descargar archivo del servicio web - en el sitio ASP.NET
Respuesta
Primero, en lugar de enviar una matriz de bytes base64, haga que su servicio web simplemente devuelva una matriz de bytes para su archivo. Response.OutputStream.Write()
automáticamente codificará automáticamente sus bytes en base64, por lo que también podría tenerlos sin codificar en su flujo de memoria.
En segundo lugar, necesitará algo más que los bytes. Necesitará metadatos asociados con el archivo. Para el siguiente fragmento, he colocado todos los metadatos en una clase separada (instancia local llamada "archivo"). A continuación, sólo tiene que utilizar este fragmento, una vez que tenga los datos que necesita:
Response.Clear();
Response.ClearHeaders();
Response.ContentType = file.ContentType;
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
Response.AddHeader("Content-Length", file.FileSize.ToString());
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
Response.Flush();
Response.End();
Cuidado con Response.End() http://stackoverflow.com/questions/1087777/is-response-end-considered-harmful –
@Todd Smith: Gracias por el puntero. Estaba al tanto del problema, pero tiene razón en que otros no; podría ser un problema serio. En el caso de una descarga de archivos, sin embargo, no hay ningún procesamiento adicional que desee o deba hacer, y por lo tanto 'Response.End()' * es * probable que sea la llamada correcta. Ciertamente es en mi caso. – Randolpho
¿Debo usar Response.Close() en lugar de Repsonse.End()? – user210757
Es posible, tendrá que asegurarse de que establece explícitamente la ContentType del HttpResponse, por ejemplo:
Response.ContentType = "image/jpeg";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Si desea controlar el nombre del archivo, se le tiene que añadir un contenido -Disposición encabezado. Google puede ayudarlo a encontrar la forma correcta de resolverlo.
+1, aunque omitió Content-Disposition, que es lo más importante para las descargas de archivos. Editar: Y luego lo agregaste. Entonces ignora esto. :) – Randolpho
que realmente depende de la interfaz a su servicio web. Es decir, SOAP, REST, ASPX.
Una cosa que puedes intentar es cambiar el tipo de contenido en tu respuesta a "Application/octet-stream". O algo similar para decirle al receptor el tipo MIME.
Si usa el repositorio de WCF, puede usar Stream como un tipo de devolución en el servicio web.
Generalmente es una mala idea incrustar un archivo en un servicio web. Simplemente agrega sobrecarga y complejidad sin ningún beneficio real.
En su lugar, debe proporcionar un IHttpHandler para manejar la carga del archivo. La mayoría de los servidores web también proporcionan API auxiliares para simplificar esto, p. en ASP.NET se puede acceder al archivo cargado con:
HttpContext.Request.Files [0]
Hay un montón de secuencias de comandos de subida de archivos javascript que simplifican esta en el cliente: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/
en realidad estoy tratando de descargar archivos al cliente, no subirlos al servidor – user210757
ese enlace es spam o perdió su contexto a tiempo. – mcy
- 1. Descargar el código fuente del sitio web de Apple
- 2. descargar un sitio web completo en C#
- 3. ASP.NET Web API descargar texto
- 4. ASP.Net Descargar archivo en el navegador del cliente
- 5. Descargar archivo utilizando el servicio WCF Rest?
- 6. Descargar un sitio web a una cadena
- 7. Consumir el servicio web SOAP en ASP.NET
- 8. arquitectura/estructura del servicio web ASP.NET
- 9. Descargar/Transmitir archivo desde la URL - asp.net
- 10. Parámetros opcionales en el servicio web ASP.NET
- 11. Probando el sitio web ASP.NET MVC
- 12. cómo descargar el archivo con el servicio en segundo plano?
- 13. Tutorial sobre el consumo de un servicio WCF en el sitio web ASP.Net?
- 14. ¿Cómo descargar un archivo adjunto de correo electrónico no leído utilizando el servicio web de Exchange en ASP.NET?
- 15. ¿Dónde entró el servicio web ASP.NET en .Net Framework 4.0?
- 16. Sitio Web ASP.NET o Project Web
- 17. Autenticación del servicio web ASP.NET desde una aplicación para iPhone
- 18. Sub-sitio web en IIS - ASP.NET
- 19. Implementación de sitio web multilingüe usando ASP.Net
- 20. Eliminación del objeto "d" del servicio web ASP.Net json output
- 21. Cargar comprobando un sitio web ASP.NET
- 22. Despliegue continuo con un sitio web ASP.NET?
- 23. ¿Cómo implementar el servicio web ASP.NET en IIS 7?
- 24. Escribir archivo en el servidor web - ASP.NET
- 25. Asp.Net: Sitio web de depuración en iis
- 26. El servicio web ASP.NET cambia el puerto en Invoke
- 27. El sitio web ASP.NET no puede ver el archivo .cs en la carpeta App_Code
- 28. Application_End no se llama en el servicio Web asp.net
- 29. Global.asax no cargando para el sitio web preppiled asp.net
- 30. Poner ASP.NET en el sitio de wordpress
Y lo es el problema que estás teniendo con ese enfoque? No hizo una pregunta, por lo que probablemente se cerrará rápidamente. – Oded