【问题标题】:How to Create href Download Links to Files with Arbitrary Extensions如何创建带有任意扩展名的文件的 href 下载链接
【发布时间】:2019-06-28 21:34:08
【问题描述】:

我有不同扩展名的文件,我在 Razor 页面视图中创建了下载链接。例如:

<a href="@Model.DownloadFile.FilePath" download="@Model.FileDownloadName" class="btn btn-outline-primary">Download</a>

这适用于以 .md 或 .txt 结尾的文件。但是对于我收到的其他扩展名

失败 - 没有文件

在 chrome 中下载时。直接浏览文件时,我收到 404。

在检查元素后,它确实显示了正确的路径,正如我所说,如果我更改扩展名,它可以工作,但我不希望用户必须将下载的文件重命名为适当的扩展名。

我正在使用带有 Razor 页面和引导程序的 ASP.NET Core 2.2。我的下载目录位于wwwroot 文件夹中,我的配置方法中确实有app.UseStaticFiles();

【问题讨论】:

    标签: c# html asp.net-core


    【解决方案1】:

    提供未知文件类型是个坏主意。这是一个安全风险,甚至文档也警告您不要使用它。如果您需要提供的文件扩展名是已知的,那么您应该为它们添加 mime 类型映射:

    services.Configure<StaticFileOptions>(o =>
    {
        var provider = new FileExtensionContentTypeProvider();
    
        // Repeat this for each extension you need to map.
        provider.Mappings[".foo"] = "text/plain";
    
        o.ContentTypeProvider = provider;
    });
    

    【讨论】:

    • 非常感谢。可能的扩展列表很长,但仍然有限,所以我将使用这种方法。最初我不介意提供每种文件类型,因为我的项目仅用于在本地网络上运行以供个人使用,并不打算部署到远程服务器,但无论如何都值得妥善处理。
    【解决方案2】:

    通过修改我的配置方法来修复

    app.UseStaticFiles();
    

    app.UseStaticFiles(new StaticFileOptions
            {
                ServeUnknownFileTypes = true,
                DefaultContentType = "image/png"
            });
    

    更多信息:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.2#non-standard-content-types

    【讨论】:

    • 要小心。首先,DefaultContentType 需要与您将要服务的内容大致匹配。将其与image/png 一起使用,然后提供 Excel 文档会导致问题。其次,这是一个安全风险,您愿意提供的文件应该明确编号。为anything 提供服务会打开一个重要的攻击向量。假设扩展不完全是随机的,最好将它们显式添加为额外的 mime 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多