2011-10-11 22 views
9

Estoy buscando una forma de (fácilmente, por preferencia;)) crear un enlace de descarga a un archivo en un servidor de archivos por separado.Creación de enlace de descarga a un archivo en un servidor de archivos

La situación es la siguiente: la aplicación que estoy desarrollando (asp.net 2.0 en vb.net pero tengo un problema similar en C#, cualquiera de las soluciones funciona para mí) se ejecutará internamente para una empresa. Como es una buena práctica, el almacenamiento de archivos y la aplicación web están en dos servidores separados.

básicamente tengo que ser capaz de crear un enlace de descarga a un archivo, el único URL disponible que tengo que acceder al archivo es \ servidor \ carpeta1 \ carpeta2 \ carpeta3 \ archivo.txt (puede ser cualquier tipo de archivo)

Los enlaces de correo electrónico simplemente no funcionan. Así es como está configurado actualmente:

tablerowfield.Text = String.Format(
    "<a href=""\\servername\folder1\folder2\folder3\{0}"" 
     target=""_blank"">Click me</a>", 
    filename) 

Lo que no funciona por razones obvias. Solía ​​estar configurado para escribir ese archivo en la propia ruta de la aplicación y funcionó perfectamente, pero no es una buena práctica y es por eso que lo estoy cambiando (o intentando).

Leo soluciones sobre cómo crear una página de descarga y luego tener una tabla en su base de datos que contiene los enlaces y devuelve la URL web adecuada para descargar, pero la restricción de tiempo que me toca desafortunadamente no me permite desarrollar eso.

Suponiendo que puedo proporcionar una cadena con el camino de archivo completo al archivo como el anterior, ¿cuál es la forma más fácil de crear un enlace que, al hacer clic, descarga el documento?

Nota: Tengo 0 derechos de administrador en este entorno. Eso realmente no me está ayudando. Supongamos que me dan el enlace correcto como el anterior y tengo los derechos de acceso a los archivos adecuados.

ACTUALIZACIÓN:

El ejemplo anterior funciona en IE, pero no en Firefox y Chrome. IE lo convierte en un enlace file: // servername/... que hace lo que se supone que debe hacer, pero tanto FF como Chrome decidieron activamente que esto no es seguro y lo han desactivado de sus navegadores.

Respuesta

16

archivo ASHX (por ejemplo, downloadfile.ashx) que puede utilizar y utiliza el siguiente código (no probado, pero será algo así) en la que:

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=abc.txt");            
Response.WriteFile(Server.MapPath("\\servername\folder1\folder2\folder3\abc.txt")); 
Response.End(); 

y luego utilizar esto en su anclaje etiqueta como:

<a href="downloadfile.ashx" target=""_blank"">Click me</a> 

Nota: también puede pasar parámetros para la descarga de diferentes tipos de archivos:

<a href="downloadfile.ashx?file=abc.txt" target=""_blank"">Click me</a> 

y luego, en el archivo ashx, use el nombre del archivo para descargar el archivo apropiado.

+0

Ok me dieron el manejador de trabajo, pero me mantiene gving errores en el Response.WriteFile. Ingresé una cadena de forma "\\ server \ folder \ file.txt" y obtengo: Error al mapear la ruta '/server/folder/file.txt' Intenté todos los archivos posibles. ¿Alguna experiencia en este tema? – Flater

+0

Puede pasar el parámetro como file = abc.txt para el primer enlace, file = otherfile.txt, etc., como ya he mencionado. Por lo tanto, obtendrá los nombres de los archivos dinámicamente y los pasará al archivo ASHX. Necesita un archivo ASHX para que el usuario pueda descargarlo desde allí (su dominio) en lugar de usar la ruta del servidor que no existe en el lado del cliente (si no está en la LAN) – wasimbhalli

+0

Omitir mi publicación anterior. Solo puedo soltar el servidor .Mappath y luego funciona :) todavía un poco borroso al finalizar esto, pero me has ayudado muchísimo. ¡Gracias! – Flater

0

\\servername\folder1\folder2\folder3\... es una ruta UNC que no se puede utilizar desde un navegador. Como los archivos están en un servidor independiente, necesita un atributo href del formulario http://server-name/folder1/folder2/file.txt.

Si el nombre-servidor es irresoluble por los clientes, a continuación, es necesario obtener primero la dirección IP del servidor y luego formular el href de la forma: http://10.1.1.30/folder1/folder2/file.txt

Así es como se obtiene la dirección IP desde nombre-servidor:

IPAddress[] host; 
host = Dns.GetHostAddresses("server-name"); 
string ip = host[0].ToString();   

EDIT:

básicamente que ser capaz de crear un enlace de descarga a un archivo

Con la solución ashx su aplicación estaría leyendo el archivo del servidor y retransmitiéndolo a los clientes en lugar de solo proporcionar a los clientes un enlace para descargar el archivo directamente desde el servidor de archivos.

3

este fragmento de código creará un archivo en la carpeta de descarga con el nombre = hi.txt y el contenido como "gracias a Dios, finalmente se descargó el archivo".

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=hi.txt"); 
Response.Write("thanks god, finally file got downloaded."); 
Response.End(); 
0

Si el archivo ya existe en el servidor, entonces puede utilizar este código en la descarga de clic de botón evento como este

protected void downloadpdf_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=""downloadName.pdf"""); 
    Response.WriteFile(Server.MapPath(@"~/path of pdf/actualfile.pdf")); 
    Response.End(); 
} 
+0

Aunque es correcto, esta respuesta es exactamente la misma que marqué como la solución * hace casi dos años *. – Flater

Cuestiones relacionadas