sinatra和http PUT

时间:2011-02-01 19:41:57

标签: ruby sinatra rack

假设我想使用curl以这种方式将文件放到web服务中

curl -v --location --upload-file file.txt http://localhost:4567/upload/filename
在sinatra我能做到:

#!/usr/bin/env ruby

require 'rubygems'
require 'sinatra'

put '/upload/:id' do
   #
   # tbd
   #
end

我如何阅读流文件?

或多或少我想要这样的东西: http://www.php.net/manual/en/features.file-upload.put-method.php#56985

2 个答案:

答案 0 :(得分:4)

最基本的例子是将它写入您正在运行sinatra in的当前目录,而不检查现有文件......只是破坏它们。

#!/usr/bin/env ruby

require 'rubygems'
require 'sinatra'

put '/upload/:id' do
  File.open(params[:id], 'w+') do |file|
    file.write(request.body.read)
  end
end

此外,你可以在curl命令中取消文件名部分,它将为你填写文件名。敌人的例子:

curl -v --location --upload-file file.txt http://localhost:4567/upload/

将导致将文件写入http://localhost:4567/upload/file.txt

答案 1 :(得分:2)

require 'rubygems'
require 'sinatra'
require 'ftools'

put '/upload' do
  tempfile = params['file'][:tempfile]
  filename = params['file'][:filename]
  File.mv(tempfile.path,File.join(File.expand_path(File.dirname(File.dirname(__FILE__))),"public","#{filename}"))
  redirect '/'
end

通过这种方式,你不必担心文件的大小,因为他没有在内存中打开(readed),而只是从临时目录移动到正确的位置,跳过一个关键的阻止程序。事实上,php代码做同样的事情,在1k块中读取文件并存储在一个新文件中,但由于文件相同,它毫无意义。 试试你可以按照本的答案。