web-dev-qa-db-fra.com

Télécharger le fichier à partir d'un lien dans ma page Web

J'ai une page Web avec une table d'objets.

Une de mes propriétés d'objet est le chemin du fichier, ce fichier est situé dans le même réseau. Ce que je veux faire, c'est envelopper le chemin du fichier sous le lien (par exemple, Télécharger) et après que l'utilisateur clique sur ce lien, le fichier sera téléchargé sur la machine utilisateur.

donc à l'intérieur de ma table:

@foreach (var item in Model)
        {    
        <tr>
            <th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th>
            <td width="1000">@item.fileName</td>
            <td width="50">@item.fileSize</td>
            <td bgcolor="#cccccc">@item.date<td>
        </tr>
    }
    </table>

J'ai créé ce lien de téléchargement:

<th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th>

Je veux que ce lien de téléchargement enveloppe mon file path et clique sur le lien qui va pencher vers mon contrôleur:

public FileResult Download(string file)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(file);
}

Qu'est-ce que j'ai besoin d'ajouter à mon code pour y parvenir?

15
user2978444

Renvoie FileContentResult de votre action.

public FileResult Download(string file)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(file);
    var response = new FileContentResult(fileBytes, "application/octet-stream");
    response.FileDownloadName = "loremIpsum.pdf";
    return response;
}

Et le lien de téléchargement,

<a href="controllerName/[email protected]" target="_blank">Download</a>

Ce lien fera une requête get vers votre action Download avec le paramètre fileName.

EDIT: pour les fichiers non trouvés que vous pouvez,

public ActionResult Download(string file)
{
    if (!System.IO.File.Exists(file))
    {
        return HttpNotFound();
    }

    var fileBytes = System.IO.File.ReadAllBytes(file);
    var response = new FileContentResult(fileBytes, "application/octet-stream")
    {
        FileDownloadName = "loremIpsum.pdf"
    };
    return response;
}
28
mecek

Dans la vue, écrivez:

<a href="/ControllerClassName/DownloadFile?file=default.asp" target="_blank">Download</a>

Dans le contrôleur, écrivez:

public FileResult DownloadFile(string file)
    {
        string filename = string.Empty;
        Stream stream = ReturnFileStream(file, out filename); //here a backend method returns Stream
        return File(stream, "application/force-download", filename);
    }
0
Rizvi Sarwar

Utilisez ce code dans le fichier du contrôleur respectif:

public ActionResult Index()
       {
           foreach (string upload in Request.Files)
           {
               if (Request.Files[upload].FileName != “”)
               {
                   string path = AppDomain.CurrentDomain.BaseDirectory + “/App_Data/uploads/”;
                   string filename = Path.GetFileName(Request.Files[upload].FileName);
                   Request.Files[upload].SaveAs(Path.Combine(path, filename));
               }
           }
           return View(“Upload”);
       }
0
Chandan Kumar

Cet exemple fonctionne bien pour moi:

public ActionResult DownloadFile(string file="")
        {

            file = HostingEnvironment.MapPath("~"+file);

            string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            var fileName = Path.GetFileName(file);
            return File(file, contentType,fileName);    

        }

Vue:

< script >
function SaveImg()
{
    var fileName = "/upload/orders/19_1_0.png";
    window.location = "/basket/DownloadFile/?file=" + fileName;
}
< /script >
<img class="modal-content" id="modalImage" src="/upload/orders/19_1_0.png" onClick="SaveImg()">
0
Hamid