【问题标题】:.NET Core 2.0 ASP.NET MVC Download File and Invoke File Save Dialog Box.NET Core 2.0 ASP.NET MVC 下载文件和调用文件保存对话框
【发布时间】:2018-05-14 10:56:23
【问题描述】:

如果可能,我想从控制器级别执行文件下载并触发浏览器的文件保存对话框。 (隐藏文件的位置)

我的解决方案是基于这篇文章。

https://www.codeproject.com/Articles/1203408/Upload-Download-Files-in-ASP-NET-Core

我最后得到的是一个文件类型(文件路径和文件类型都正确),但是没有触发浏览器打开对话框来保存这个文件。 (如果是href链接会发生什么)

如何做到这一点?

【问题讨论】:

  • 对于那些为上面的链接只显示下载的操作方法而苦恼的人,没有标记或脚本,请注意教程顶部有一个链接,用于在 github 下载项目。它只是一个简单的锚,将文件名添加到参数列表中,其余的很神奇。

标签: .net file c#-4.0 asp.net-core download


【解决方案1】:

你可以这样做。

public IActionResult Download(string filename)
{
    var file = Path.Combine(_hostingEnvironment.WebRootPath, "files", filename);
    return File(System.IO.File.ReadAllBytes(file), "application/octet-stream", filename);
}

它正在从文件中读取所有字节并返回application/octet-stream,显示下载对话框。

提到的其他方式here

【讨论】:

  • return File(System.IO.File.ReadAllBytes("C:/Temp/Generic.csv"), "application/octet-stream", "Generic.csv"); 是我要返回的内容,文件确实存在,但我得到的下载对话框为零。
  • 无法在 .net core 2.0 中找到 File()。我可以知道需要添加的命名空间或 nuget 包吗?
  • 如果我没记错的话,你不需要添加任何包或命名空间。希望你继承自控制器类。
  • 有点过时了......但最好的答案是“这是一个浏览器设置”。如果关闭,文件将下载到浏览器设置中指定的默认位置。如果打开,则会询问用户将文件保存在哪里,例如“另存为对话框”。我见过的大多数试图覆盖浏览器尝试执行的操作的技术都不起作用或无法在不同的浏览器中始终如一地工作。只是我的 2 位 ....
  • Hardik -> “文件”在名为“System.IO”的命名空间中;
【解决方案2】:

这是从用户控制器的 wwwroot/files 目录下载“alert.mp3”文件的完整解决方案。

查看:

            <form class="form-inline" method="post" enctype="multipart/form-data" asp-controller="User" asp-action="DownloadFile">

                <input id="@item.ID" name="fileName" type="hidden" class="form-control" placeholder="@item.ID" value="alert.mp3">
                <button type="submit" style="border:hidden;background-color:transparent" data-toggle="tooltip" title="Download!">
                    <span type="submit" id="@item.ID;@item.AuthorID;Download" class="featurette-image img-fluid mx-auto glyphicon glyphicon-cloud-download" style="cursor:pointer;color:cornflowerblue;font-size: 2em;" data-toggle="tooltip" title="Download">
                    </span>
                </button>
            </form>

控制器:

    public async Task<FileResult> DownloadFile(string fileName)
    {
        var path = Path.Combine(
           Directory.GetCurrentDirectory(),
           "wwwroot\\files\\", fileName);

        var memory = new MemoryStream();
        using (var stream = new FileStream(path, FileMode.Open))
        {
            await stream.CopyToAsync(memory);
        }
        memory.Position = 0;
        return File(memory, MediaTypeNames.Application.Octet, Path.GetFileName(path));
    }

干杯!

【讨论】:

    【解决方案3】:

    检查此解决方案是否有效(包括您的回答 Anuraj):

    https://www.codeproject.com/Articles/1203408/Upload-Download-Files-in-ASP-NET-Core

    (当我从 javascript 调用此发布请求时,不一定)

    但是当它是通过从 HTTP 级别调用 Controller 的 Action 直接调用或作为 Controller 的 Index 方法调用时。 问题已解决。

    【讨论】:

    • 我不明白。我正在返回文件,但在那之后应该发生什么?你分享的链接我已经找到了,只是说正在上传和下载,但我看不到下载发生。
    • 请用完整的解决方案检查新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多