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