Синатра и http PUT - PullRequest
       20

Синатра и http PUT

5 голосов
/ 01 февраля 2011

предположим, что я хочу использовать curl, чтобы поместить файл в веб-сервис таким образом

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

в Синатре я могу сделать:

#!/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 ]

4 голосов
/ 02 февраля 2011

Самый простой пример - это запись в директиву currect, в которой вы запускаете sinatra, без проверки существующих файлов ... просто скопирование их.

#!/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

2 голосов
/ 30 июня 2011
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

Таким образом, вам не нужно беспокоиться о размере файла, поскольку он не открыт (не прочитан) в памяти, а просто перемещен из временного каталога в нужное место, пропуская важный блокировщик. Фактически, код php делает то же самое, читает файл в 1k кусках и сохраняет в новом файле, но так как файл тот же самый, его бессмысленно. Чтобы попробовать вы можете следовать ответу Бена.

...