Erlang 如何使用Cowboy下载文件?

Erlang 如何使用Cowboy下载文件?,erlang,cowboy,Erlang,Cowboy,我想从浏览器下载文件,我试图通过cowboy实现,但是我失败了,浏览器显示“从服务器接收到重复头”。我不知道,请大家帮帮我。这是我的处理程序代码: ` %%@doc GET echo处理程序。 -模块(顶部把手2)。 -导出([init/3])。 -导出([handle/2])。 -导出([终止/3])。 初始化(_传输,请求,[])-> {确定,请求,未定义}。 句柄(请求、状态)-> {Method,Req2}=cowboy_req:Method(req), {Echo,Req3}=cowb

我想从浏览器下载文件,我试图通过cowboy实现,但是我失败了,浏览器显示“从服务器接收到重复头”。我不知道,请大家帮帮我。这是我的处理程序代码: `

%%@doc GET echo处理程序。
-模块(顶部把手2)。
-导出([init/3])。
-导出([handle/2])。
-导出([终止/3])。
初始化(_传输,请求,[])->
{确定,请求,未定义}。
句柄(请求、状态)->
{Method,Req2}=cowboy_req:Method(req),
{Echo,Req3}=cowboy_req:qs_val(,Req2),
{ok,Req4}=echo(方法,Req3),
{好的,请求4,状态}。
回声(,未定义,请求)->
牛仔要求:回复(400,[],要求);
%%下载文件的主要部分在这里
%%我只想下载文件README.md
回声(,回声,请求)->
F=乐趣(插座、运输)->
传输:sendfile(套接字,“priv/README.md”)
完,,
Req2=牛仔要求:设置相应的车身乐趣(1024,F,req),
Req3=牛仔需求:设置响应标题(,“获取”,Req2),
Req4=牛仔需求:设置响应头(,“获取”,Req3),
Req5=牛仔需求:设置响应头(,“获取”,Req4),
Req6=牛仔需求:设置响应头(,“获取”,Req5),
牛仔要求:答复(200[
{, }
],第6条);
回声(u,u,Req)->
%%方法不允许。
牛仔要求:回复(405,要求)。
终止(原因、要求、状态)->
嗯`

Cowboy有一个内置的处理程序,用于处理静态文件。 这里有记录:

github上有一个例子:


通过这种方式,您不必手动设置标题,这将防止出现错误。

Cowboy有一个内置的处理程序,用于处理静态文件。 这里有记录:

github上有一个例子:


这样,您就不必手动设置标题,这应该可以防止出现错误。

对于OP来说,这显然为时已晚,但可能会有助于从Google找到这些标题

您的问题是,您正在用
cowboy\u req:reply/4
函数覆盖您使用
set\u resp\u body\u fun
设置的响应主体函数。您需要做的就是将该行替换为一个
cowboy_req:reply/3
调用,该调用不显式设置正文

cowboy_req:reply(200, [
    {<<"content-type">>, <<"application/octet-stream">>}
], Req6);
牛仔要求:回复(200[ {, } ],第6条);
你应该会发现它是有效的。

对于OP来说,这显然太晚了,但也许它会帮助一些人从谷歌找到它

您的问题是,您正在用
cowboy\u req:reply/4
函数覆盖您使用
set\u resp\u body\u fun
设置的响应主体函数。您需要做的就是将该行替换为一个
cowboy_req:reply/3
调用,该调用不显式设置正文

cowboy_req:reply(200, [
    {<<"content-type">>, <<"application/octet-stream">>}
], Req6);
牛仔要求:回复(200[ {, } ],第6条);
您应该会发现它是有效的。

非常感谢您。你能告诉我如何让“牛仔要求:让身体变得有趣”吗?何时何地可以使用此功能?非常感谢。你能告诉我如何让“牛仔要求:让身体变得有趣”吗?何时何地可以使用此功能?