2011-02-01 3 views
5

Предположим, я хочу использовать локон, чтобы поместить файл в WebService этот путьСинатра и HTTP PUT

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

[Этот вопрос] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack) подразумевает, что то, что вы хотите, невозможно сделать, но я еще не знаю достаточно об этом, чтобы быть уверенным, чтобы опубликовать его как ответ. – Phrogz

+0

@Phrogz Я только что нашел это: http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - подумал, что вам может быть интересно. – matt

ответ

4

Самый простой пример написания его в currect директории вы работаете Синатру в без проверки для существующих файлов ... просто сбивание их.

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

Кроме того, вы можете оставить часть от имени файла в локон команде, и он будет заполнить его для вас с именем файла. Foe пример:

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

приведет к записи файла http://localhost:4567/upload/file.txt

+0

Ожидает ли блок маршрута до тех пор, пока запрос не будет завершен, или это не позволит потоковой передачи результатов по мере их поступления? – Phrogz

+0

Я не знаю о потоке ... Я пропустил эту деталь – Ben

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 

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