假设我想使用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
答案 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/
答案 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块中读取文件并存储在一个新文件中,但由于文件相同,它毫无意义。 试试你可以按照本的答案。