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?
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;
}
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);
}
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”);
}
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()">