如何在Sinatra中发送二进制数据?

18

我希望在Sinatra应用程序中发送二进制数据,以便用户可以将其作为文件下载。

我尝试使用send_data,但它给出了一个undefined method 'send_data'的错误信息。

我该如何实现呢?

我可以将数据写入文件,然后使用send_file,但我宁愿避免这样做。

4个回答

31

你可以直接返回二进制数据:

get '/binary' do
  content_type 'application/octet-stream'
  "\x01\x02\x03"
end

9
我是这样做的:
get '/download/:id' do
  project = JSON.parse(Redis.new.hget('active_projects', params[:id]))
  response.headers['content_type'] = "application/octet-stream"
  attachment(project.name+'.tga')
  response.write(project.image)
end

7

当前版本的Sinatra有一种流式数据的方式:

get '/' do
  stream do |out|
    out << "It's gonna be legen -\n"
    sleep 0.5
    out << " (wait for it) \n"
    sleep 1
    out << "- dary!\n"
  end
end

来源: http://www.sinatrarb.com/intro#Streaming%20Responses

Sinatra是一种用于构建Web应用程序的Ruby库。在处理大型响应体时,使用流式传输可以避免将整个响应存储在内存中,从而提高性能和减少延迟。

Sinatra支持使用块或枚举器来处理流式响应。以下示例演示如何使用块:

get '/stream' do
  stream do |out|
    out.puts "Hello"
    sleep 1
    out.puts "World"
  end
end

此路由将在每秒钟向客户端发送一条消息。在处理很长时间的响应时,您可以在块中使用循环并根据需要调用sleep


0
我使用了类似这样的代码:
require 'sinatra'

set :port, 8888
set :bind, '0.0.0.0'
filename = 'my_firmware_update.bin'

get '/' do
    content_type 'application/octet-stream'
    File.read(filename)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接