Erlang 在使用静态处理程序时,是否可以更改下载文件名?

Erlang 在使用静态处理程序时,是否可以更改下载文件名?,erlang,cowboy,Erlang,Cowboy,在cowboy2中使用静态文件处理程序提供文件时,是否可能使“下载”文件名与磁盘上的实际文件名不同 例如,假设我正在提供静态文件“123”。当用户在浏览器中下载它时,是否可以将其显示为“123.txt” 因为现在,我所有的文件名都会自动分配一个扩展名为“.dms”的文件名。我认为静态处理程序的正常操作不是返回浏览器下载的文件 当静态处理程序无法[识别]扩展时,它将 将文件作为应用程序/八位字节流发送。接收这种信息的浏览器 文件将尝试将其直接下载到磁盘 稍微备份一下,http响应几乎总是包含一个内

在cowboy2中使用静态文件处理程序提供文件时,是否可能使“下载”文件名与磁盘上的实际文件名不同

例如,假设我正在提供静态文件“123”。当用户在浏览器中下载它时,是否可以将其显示为“123.txt”


因为现在,我所有的文件名都会自动分配一个扩展名为“.dms”的文件名。

我认为静态处理程序的正常操作不是返回浏览器下载的文件

当静态处理程序无法[识别]扩展时,它将 将文件作为应用程序/八位字节流发送。接收这种信息的浏览器 文件将尝试将其直接下载到磁盘

稍微备份一下,http响应几乎总是包含一个
内容类型
头,它指定发送到浏览器的内容类型,以便浏览器知道如何显示内容。内容的类型由
mime类型指定。包含典型html页面的响应具有如下内容类型标题:

Content-Type: text/html; charset=utf-8
text/html
mime类型告诉浏览器不要将文件显示为文本,而是将文本呈现为html

Cowboy查看请求文件的扩展名,以确定在响应的内容类型头中指定的mime类型。如果文件没有扩展名,则Cowboy将mime类型指定为
application/octet stream
,这会导致浏览器下载该文件。你的浏览器基本上会说,“我不知道如何显示这个二进制数据,所以在这里,你拿着这个文件,想办法处理它。”

如果所有没有扩展名的文件都是(纯)文本文件,那么您可以告诉cowboy为所有与路由匹配的文件设置mime类型
text/plain

hello_erlang/src/hello_erlang_app.erl:

-module(hello_erlang_app).
-behaviour(application).

-export([start/2]).
-export([stop/1]).

start(_Type, _Args) ->
    Dispatch = cowboy_router:compile([
        {'_', [
               {"/dog/[...]", cowboy_static, 
                    {
                        priv_dir, 
                        hello_erlang, 
                        "static/assets", 
                        [{mimetypes, {<<"text">>, <<"plain">>, []} }] %<**HERE
                    }
               },

               {"/please_upgrade_to_websocket", myws_handler, []} 
        ]}
    ]),

    {ok, _} = cowboy:start_clear(my_http_listener,
        [{port, 8080}],
        #{env => #{dispatch => Dispatch} }
    ),

    hello_erlang_sup:start_link().

stop(_State) ->
    ok.
-module(hello_erlang_app).
-behaviour(application).

-export([start/2]).
-export([stop/1]).

start(_Type, _Args) ->
    Dispatch = cowboy_router:compile([
        {'_', [
               {"/dog/[...]", cowboy_static, 
                    {
                        priv_dir, 
                        hello_erlang, 
                        "static/assets", 
                        [{mimetypes, my_mime_setter, set_type}] %<** HERE  {mimetypes, MODULE, FUNCTION}
                    }
               },

               {"/please_upgrade_to_websocket", myws_handler, []} 
        ]}
    ]),

    {ok, _} = cowboy:start_clear(my_http_listener,
        [{port, 8080}],
        #{env => #{dispatch => Dispatch} }
    ),

    hello_erlang_sup:start_link().

stop(_State) ->
    ok.
并用正斜杠连接这两个单词,以生成mime类型的“text/plain”

目录结构:

hello_erlang/priv/static/assets/
    file1
    file2
    file3
网址:

您还可以告诉cowboy调用自定义函数来设置文件的mime类型:

hello_erlang/src/hello_erlang_app.erl:

-module(hello_erlang_app).
-behaviour(application).

-export([start/2]).
-export([stop/1]).

start(_Type, _Args) ->
    Dispatch = cowboy_router:compile([
        {'_', [
               {"/dog/[...]", cowboy_static, 
                    {
                        priv_dir, 
                        hello_erlang, 
                        "static/assets", 
                        [{mimetypes, {<<"text">>, <<"plain">>, []} }] %<**HERE
                    }
               },

               {"/please_upgrade_to_websocket", myws_handler, []} 
        ]}
    ]),

    {ok, _} = cowboy:start_clear(my_http_listener,
        [{port, 8080}],
        #{env => #{dispatch => Dispatch} }
    ),

    hello_erlang_sup:start_link().

stop(_State) ->
    ok.
-module(hello_erlang_app).
-behaviour(application).

-export([start/2]).
-export([stop/1]).

start(_Type, _Args) ->
    Dispatch = cowboy_router:compile([
        {'_', [
               {"/dog/[...]", cowboy_static, 
                    {
                        priv_dir, 
                        hello_erlang, 
                        "static/assets", 
                        [{mimetypes, my_mime_setter, set_type}] %<** HERE  {mimetypes, MODULE, FUNCTION}
                    }
               },

               {"/please_upgrade_to_websocket", myws_handler, []} 
        ]}
    ]),

    {ok, _} = cowboy:start_clear(my_http_listener,
        [{port, 8080}],
        #{env => #{dispatch => Dispatch} }
    ),

    hello_erlang_sup:start_link().

stop(_State) ->
    ok.
mime类型将设置为
text/plain
,浏览器不会呈现html,相反,您将看到原始html。如果您请求第二个文件:

http://localhost:8080/dog/file4
mime类型将设置为
text/html
,这将导致浏览器呈现文本,您应该会看到一些红色文本

如果你想在有扩展名的文件上下注,你可以写:

   _Ext ->
       cow_mimetypes:web(Fname)
cowboy将使用其算法生成mime类型

<div><font color="red">red text</font></div>
http://localhost:8080/dog/file1
http://localhost:8080/dog/file4
   _Ext ->
       cow_mimetypes:web(Fname)