web-dev-qa-db-fra.com

Création d'un lien de téléchargement vers un fichier sur un serveur de fichiers

Je cherche un moyen (facilement, de préférence;)) de créer un lien de téléchargement vers un fichier sur un serveur de fichiers distinct.

La situation est la suivante: l'application que je développe (asp.net 2.0 sur vb.net mais j'ai un problème similaire en c #, que la solution fonctionne pour moi) sera exécutée en interne pour une entreprise . Comme c'est bon En pratique, le stockage de fichiers et l’application Web se trouvent sur deux serveurs distincts.

J'ai essentiellement besoin de pouvoir créer un lien de téléchargement vers un fichier. La seule URL disponible pour accéder au fichier est \ nomserveur\folder1\folder2\folder3\file.txt (peut être n'importe quel type de fichier).

Les liens ne fonctionnent tout simplement pas. Voici comment il est actuellement configuré:

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

Ce qui ne fonctionne pas pour des raisons évidentes. Auparavant, il était configuré pour écrire ce fichier sur le chemin d’application lui-même et cela fonctionnait parfaitement, mais ce n’est pas une bonne pratique et c’est pourquoi je le modifie (ou essaie de le faire).

J'ai lu des solutions sur la création d'une page de téléchargement, puis la création dans votre base de données d'un tableau contenant les liens et renvoyant l'URL Web appropriée pour le téléchargement, mais la contrainte de temps qui m'est imposée ne me permet malheureusement pas de développer cela.

En supposant que je puisse fournir une chaîne avec le chemin d'accès complet au fichier comme ci-dessus, quel est le moyen le plus simple de créer un lien qui, lorsque vous cliquez dessus, télécharge le document?

Remarque: j'ai 0 droits d'administrateur dans cet environnement. Cela ne m'aide vraiment pas. Supposons que le lien correct, comme ci-dessus, est attribué et que je dispose des droits d'accès aux fichiers appropriés.

METTRE À JOUR:

L'exemple ci-dessus fonctionne dans IE, mais pas dans Firefox et Chrome. IE le convertit en un lien fichier: // nom_serveur/... qui fait ce qu'il est censé faire, mais FF et Chrome ont tous deux activement décidé que cela était dangereux et l'ont désactivé de leurs navigateurs.

10
Flater

Vous pouvez utiliser le fichier ASHX (par exemple, downloadfile.ashx) et utiliser le code suivant (non testé, mais ce sera un peu comme ça):

 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();

puis utilisez ceci dans votre balise d'ancrage comme:

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

Remarque: vous pouvez également définir des paramètres pour le téléchargement de différents fichiers, tels que:

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

puis, dans le fichier ashx, utilisez le nom de fichier pour télécharger le fichier approprié.

18
wasimbhalli

ce morceau de code créera un fichier dans le dossier de téléchargement avec le nom = hi.txt et un contenu comme "grâce à Dieu, le fichier a finalement été téléchargé". 

 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();
2
Narottam Goyal

Si votre fichier existe déjà sur le serveur, vous pouvez utiliser ce code dans l'événement du clic du bouton de téléchargement comme celui-ci

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
user2766067