sinatra and http PUT
suppose i want to use curl to put a file to a webservice this way
curl -v --location --upload-file file.txt http://localhost:4567/upload/filename
in sinatra i can do:
#!/usr/bin/env ruby
r开发者_运维技巧equire 'rubygems'
require 'sinatra'
put '/upload/:id' do
#
# tbd
#
end
how can i read the streaming file?
more or less i want something like this: http://www.php.net/manual/en/features.file-upload.put-method.php#56985
The most basic example is writing it to the currect directory you are running sinatra in with no checking for existing files ... just clobbering them.
#!/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
Also, you can leave off the filename portion in the curl command and it will fill it in for you with the filename. Foe example:
curl -v --location --upload-file file.txt http://localhost:4567/upload/
will result in writing the file to http://localhost:4567/upload/file.txt
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
In this way, you does not have to worry about the size of the file, since he's not opened (readed) in memory but just moved from the temp directory to the right location skipping a crucial blocker. In fact, the php code do the same stuff, read the file in 1k chunks and store in a new file, but since the file its the same, its pointless. To try you can follow the answer of Ben.
精彩评论