• 热门搜索 热门搜索

您现在的位置是:博客 > 文章详情文章详情

.net 6.0 下载特殊后缀(.scl)的文件反回404错误的原因

原创
时间2023/12/16 07:56:11 发布 预览数量95
分类: .net core .net c# 标签: .net 6.0

一、前言

最近有一个需求就是,需要生成一份PLC的 SCL 代码,将路径返回给前端,并提供下载的接口,导入博图进行测试。文件生成放在了 wwwroot 文件夹, 但是访问下载的时候却报 404 Not Found。一开始我以为是没有注册 ‘app.UseStaticFiles()‘ 中间件,后来发现有注册。
后来发现同目录下的.txt文件是可以被访问到的。到这里,我猜测可能是特殊后缀的文件需要有特殊的设置。

.net 6.0 下载特殊后缀(.scl)的文件反回404错误的原因

二、问题原因

经了解, .net 支持一些常用的格式文件下载,如下所示:

  • .txt:文本文件
  • .csv:逗号分隔值文件
  • .pdf:Portable Document Format文件
  • .docx:Microsoft Word文档
  • .xlsx:Microsoft Excel电子表格
  • .pptx:Microsoft PowerPoint演示文稿
  • .png:Portable Network Graphics图像
  • .jpg:JPEG图像
  • .gif:Graphics Interchange Format图像
  • .mp3:MPEG-1 Audio Layer 3音频文件
  • .mp4:MPEG-4视频文件

由于我需要下载的后缀是(.scl),属于是 MIME(Multipurpose Internet Mail Extensions) 类型的文件,所以我们需要指定其 ‘Content-Type’的值。

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是一个互联网标准,扩展了电子邮件的标准,使其能够支持:非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。

三、解决方案

既然知道问题所在了, 解决起来就比较简单了。

    /// <summary>
    /// 初始化文件 ContentType 提供器
    /// </summary>
    /// <returns></returns>
    public static FileExtensionContentTypeProvider GetFileExtensionContentTypeProvider()
    {
        var fileExtensionProvider = new FileExtensionContentTypeProvider();
        fileExtensionProvider.Mappings[".scl"] = "application/octet-stream";
        fileExtensionProvider.Mappings[".iec"] = "application/octet-stream";
        fileExtensionProvider.Mappings[".patch"] = "application/octet-stream";
        fileExtensionProvider.Mappings[".apk"] = "application/vnd.android.package-archive";
        fileExtensionProvider.Mappings[".pem"] = "application/x-x509-user-cert";
        fileExtensionProvider.Mappings[".gzip"] = "application/x-gzip";
        fileExtensionProvider.Mappings[".7zip"] = "application/zip";
        fileExtensionProvider.Mappings[".jpg2"] = "image/jp2";
        fileExtensionProvider.Mappings[".et"] = "application/kset";
        fileExtensionProvider.Mappings[".dps"] = "application/ksdps";
        fileExtensionProvider.Mappings[".cdr"] = "application/x-coreldraw";
        fileExtensionProvider.Mappings[".shtml"] = "text/html";
        fileExtensionProvider.Mappings[".php"] = "application/x-httpd-php";
        fileExtensionProvider.Mappings[".php3"] = "application/x-httpd-php";
        fileExtensionProvider.Mappings[".php4"] = "application/x-httpd-php";
        fileExtensionProvider.Mappings[".phtml"] = "application/x-httpd-php";
        fileExtensionProvider.Mappings[".pcd"] = "image/x-photo-cd";
        fileExtensionProvider.Mappings[".bcmap"] = "application/octet-stream";
        fileExtensionProvider.Mappings[".properties"] = "application/octet-stream";
        fileExtensionProvider.Mappings[".m3u8"] = "application/x-mpegURL";
        fileExtensionProvider.Mappings[".*"] = "application/octet-stream";
        return fileExtensionProvider;
    }

Startup类中的 Configure 中配置 ContentType 提供器

app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = GetFileExtensionContentTypeProvider()
});

拓展: application/octet-stream 是什么类型

application/octet-stream 是一种通用的二进制文件类型,表示一种流式的数据格式。它通常用于表示二进制文件,如文档、图像、音频、视频等。这种类型的数据通常需要进行特定的解码才能被正确读取和处理。在Web开发中,当你想让用户下载一个文件时,常常会使用application/octet-stream作为响应的MIME类型。这样,浏览器就会知道它应该尝试将响应的内容作为文件进行下载,而不是尝试在浏览器中打开或执行它。

例如,在HTTP响应头中,可以使用Content-Disposition来告诉浏览器将响应的内容作为文件下载:

Content-Disposition: attachment; filename="converts.scl"

这样,浏览器就会提示用户下载名为”converts.scl”的文件,而不是尝试在浏览器中打开或执行它。

版权声明:本文为Converts的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.converts.cn/article/2592453.html

暂无评论

暂无评论

目录

推荐阅读

  • Docker 部署FastTunnel,实现内网穿透

    ## 一、前言 最近在学习搭建**Elasticsearch**集群,但是发现云服务(2核4G)资源根本就不够用,部署上去就直接宕机了。想着服务器资源太贵, 家里刚好有一台**64G**内存的闲置电脑。不如做一个**内网穿透**,可以远程访问。工作学习两不误。其实目前市面上已经有很多穿透工具了,比如向日葵~~ ,但是奈何带宽太小了,免费的才1M~~~ ## 二、什么是 FastTunnel **FastTunnel** 是用.net core开发的一款跨平台内网穿透工具,它可以实现将内网服务暴露到公网供自己或任何人访问。 与其他穿透工具不同的是:FastTunnel项目致力于打造一个易于扩

  • 解决:“The configured user limit (128) on the number of inotify instances has been reached....” 错误

    ## 一、场景再现 在linux系统上运行着10个微服务,突然发现某个服务挂了。遇到这种情况,一般就使用命令`docker start` 就可以解决。 然而发现命令无法使服务起来。根据跟踪容器日志发现是出现了异常,如下所示: ```shell Unhandled exception. System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open fi

  • Docker 安装mysql

    ## 一、创建mysql 容器 ```shell docker run \ -d \# 后台运行 --restart=always \#总是跟随docker启动 --privileged=true\#获取宿主机root权限 -p 13306:3306 --name mysql \# 容器与主机映射端口为,主机13306,容器3306 -v /mysql/log:/var/log/mysql \# 容器运行后的名称 -v /mysql/data:/var/lib/mysql \# mysql 目录挂载 -v /etc/localtime:/etc/localtime:ro \#让容器的时钟与宿主

  • validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService

    ## 一、问题 安装k8s集群, Node节点加入主节点的时候(`kubeadm join...`),报错,报错信息如下: ```shell [root@node1 ~]# kubeadm join k8s-master:6443 --token 4nm8cy.jgxw8go95c1uqt6c --discovery-token-ca-cert-hash sha256:f1c08bce4ebeb8deb531b950e644cca399efc40e1a9ac99df21b7b38a31a6c02 [preflight] Running pre-flight checks

  • k8s 安装ingress,并解决拉取镜像失败的问题

    ## 一、前言 Service 是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法,但是Service 只能在内网间访问(NodePort方式用的较少), 那么外网的路由请求如何发送到 Service 上呢? k8s 为我们提供了 Ingress 网关服务。 ## 二、什么是Ingress ? Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例: ![k8s 安装ingress,并解决拉取镜像失败的问题](/Article

  • ssh 免密登录

    ## 一、前言 SSH(Secure Shell)免密登录是一种安全便捷的远程登录方式,允许用户在不输入密码的情况下连接到远程Linux服务器。它通过密钥认证来实现登录,这种方法可以提高工作效率,同时加强系统的安全性。 ## 二、秘钥的存放位置 一般秘钥都存放在用户的根目录下 `~/.ssh`,如下图所示 ![ssh 免密登录](/ArticleFile/2024-01-09/802cf3e23bde4298bf4accd9929878c6.png 'ssh 免密登录') .ssh 目录下一般会有两个文件 `id_rsa:私钥` 、 `id_rsa.pub:公钥`。 ![ssh 免密

  • k8s http: server gave HTTP response to HTTPS client

    ## 一、问题 k8s 在拉取私有仓库镜像的时候报`http: server gave HTTP response to HTTPS client`错,网络上的答案都是千篇一律的,根本就没有抓住问题的根源。下面就有我来剖析一下问题的原因。 ```shell Type Reason Age From Message ---- ------ ---- ---- ------- Normal Schedule

  • org.jenkinsci.plugins.scriptsecurity.scripts.UnapprovedUsageException: script not yet approved for use

    ## 一、报错信息 jenkins 中编写pipeline脚本的时候,执行构建,报如下错误: ```shell Started by user admin org.jenkinsci.plugins.scriptsecurity.scripts.UnapprovedUsageException: script not yet approved for use at org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.using(ScriptApproval.java:676) at org.jenkinsci.plugin

  • kubeadm init:failed to pull image registry.k8s.io/pause:3.6

    ## 一、错误现象 在安装 **K8s 1.28.0** 的时候,**kubeadm init...** 执行失败,错误信息如下: ```shell [kubelet-check] Initial timeout of 40s passed. Unfortunately, an error has occurred: timed out waiting for the condition This error is likely caused by: - The kubelet is not running - The kubelet is

  • .net core 通过环境变量加载配置文件(Development、Staging、Production)

    ## 一、前言 在**.net core 2.1** 之前,每次更新程序, 都需要手动更改数据库连接字符串。如果不小心把测试库发布上去了, 问题就大了。不过好在.NET Core 2.1及以上版本增加了支持根据环境变量加载配置文件。简单点理解就是, **代码中有三个配置文件(开发,测试,生产),程序发布之后, 更具服务器的环境变量, 自动加载相应的配置文件,不用在每次手动的切换了**。很是方便。 ## 二、实现 要想实现此功能,我们需要设置对应配置文件的后缀,以便系统会自动识别。 **举个例子:** 假设现在有一个叫 `Database.json` 的数据库配置文件,我们只需要再创建两个配

加载中