Скачать файл со ссылкой на мою страницу
У меня есть веб-страница с таблицей объектов.
Одним из свойств объекта является путь к файлу, этот файл находится в той же сети. То, что я хочу сделать, это обернуть этот путь к файлу по ссылке (например, Скачать), и после того, как пользователь нажмет на эту ссылку, файл загрузится на пользовательскую машину.
поэтому внутри моей таблицы:
@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>
Я создал эту ссылку для скачивания:
<th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th>
Я хочу, чтобы эта ссылка для загрузки перенесла мой file path
и нажала на ссылку, которая будет привязана к моему контроллеру:
public FileResult Download(string file)
{
byte[] fileBytes = System.IO.File.ReadAllBytes(file);
}
Что мне нужно добавить в мой код, чтобы добиться этого?
Ответы
Ответ 1
Верните FileContentResult из вашего действия.
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;
}
И ссылка для скачивания
<a href="controllerName/[email protected]" target="_blank">Download</a>
Эта ссылка сделает запрос на получение вашего действия Download с параметром fileName.
EDIT: для не найденных файлов вы можете,
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;
}
Ответ 2
В представлении пишите:
<a href="/ControllerClassName/DownloadFile?file=default.asp" target="_blank">Download</a>
В контроллере напишите:
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);
}
Ответ 3
Этот пример отлично подходит для меня:
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);
}
Вид:
< 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()">