【问题标题】:How to correctly return a file to a view?如何正确地将文件返回到视图?
【发布时间】:2019-03-20 08:30:02
【问题描述】:

我很难完成一项本应轻松的任务,而且我不知道我做错了什么,或者我必须在其他地方寻找问题。基本上我有我的 javascript POST 请求:

    $.ajax(
        {
            url: "/upload",
            type: "POST",
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            success: function (data) {
                stopUpdatingProgressIndicator();
            }
        }
    );
}

var intervalId;

function startUpdatingProgressIndicator() {
$("#progress").show();
$.post(
    "/upload/progress",
    function (progress) {

    }
); 

在我的控制器中,我以这种方式提供文件:

return File(fileMod, System.Net.Mime.MediaTypeNames.Application.Octet, "test.mod");

但是什么也没发生,没有文件可供下载,fileMod 是一个简单的字节数组,并且没有显示错误..

编辑 我还尝试在我的'return file'中将内容类型设置为'application/force-download`,但没有成功。

【问题讨论】:

  • return File 存在于哪个动作中?如果您直接从 AJAX POST 返回文件,这是不可能的(您必须使用 GET 操作来下载它)。
  • 如果您将文件返回给 ajax 请求(GET 或 POST),那么 ajax 请求会接收文件,而不是浏览器,因此您不会收到“下载提示”存储在data 中的success:function(data) - 你需要在success: 中添加一些javascript 来告诉浏览器提示保存它。
  • 最简单的选择是通过 url 打开下载操作到一个新的浏览器窗口/选项卡 - 该窗口将显示一个进度条并在文件下载后自动关闭。不过可能不适合您的情况。
  • @freedomn-m 非常感谢您的回复!你能提供一个小例子作为答案吗?为我指明正确的方向?

标签: jquery post asp.net-core-mvc asp.net-core-2.1


【解决方案1】:

这是一个非常简单的控制器操作示例,它从数据库(路径、名称等)加载文件信息,然后从磁盘加载该文件。

[HttpGet]
public IActionResult DownloadFile(Guid fileId)
{
    var file = _context.Files.FirstOrDefault(x => x.Id == fileId);

    if (file == null)
    {
        return ...
    }

    // you may also want to check permissions logic
    // e.g if (!UserCanDownloadFiles(user)) { return ... }

    var bytes = File.ReadAllBytes(file.PhysicalPath)); // add error handling here
    return new FileContentResult(bytes, "application/octet-stream") { FileDownloadName = file.FriendlyName }
}

物理路径 = 例如C:\AppFiles\file.jpg

FriendlyName = 例如file.jpg

您可能需要阅读:https://en.wikipedia.org/wiki/Media_type

示例下载:

<a class="text-info" href="@Url.Action("DownloadFile", "MyController", new { fileId = item.Id })">Download</a>

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2019-02-21
    • 2013-12-17
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多