2011-02-01 17 views
5

Załóżmy, że chcesz użyć curl umieścić plik usługa ten sposóbSinatra i HTTP PUT

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

w Sinatra mogę zrobić:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

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

jaki sposób można odczytać pliku strumieniowego?

mniej lub bardziej chcę coś takiego: http://www.php.net/manual/en/features.file-upload.put-method.php#56985

+0

[To pytanie] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack) oznacza, że ​​tego, czego chcesz, nie można zrobić, ale jeszcze nie wiem wystarczy o tym, by napisać odpowiedź jako odpowiedź. – Phrogz

+0

@Phrogz Właśnie znalazłem to: http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - myślałem, że możesz być zainteresowany. – matt

Odpowiedz

4

Najprostszym przykładem jest pisanie go do katalogu currect są uruchomione Sinatrę w bez sprawdzania istniejących plików ... po prostu je przebijania.

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

Możesz również pominąć część nazwy pliku w poleceniu curl i zapełni ją nazwą pliku. Foe przykład:

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

spowoduje zapisu pliku do http://localhost:4567/upload/file.txt

+0

Czy blokowanie trasy kończy się, dopóki żądanie nie zostanie zakończone, czy umożliwia to przesyłanie strumieniowe wyników po ich otrzymaniu? – Phrogz

+0

Nie wiem o przesyłaniu strumieniowym ... Brakowało mi tego szczegółu – 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 

W ten sposób, nie trzeba się martwić o wielkości pliku, ponieważ on nie otworzył (odczytany) w pamięć, ale po prostu przeniósł się z katalogu tymczasowego do właściwej lokalizacji, pomijając kluczowy bloker. W rzeczywistości kod php robi to samo, czyta plik w porcjach 1k i przechowuje w nowym pliku, ale ponieważ plik jest taki sam, nie ma sensu. Aby spróbować, możesz podążać za odpowiedzią Bena.

Powiązane problemy