2011-02-01 7 views
5

は私が行うことができますシナトラにこのようにWebサービスへシナトラとHTTP

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

をファイルに入れてカールを使用したいとPUT:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

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

がどのように私は、ストリーミングファイルを読み込むことができますか?ちょうどそれらをつかう...最も基本的な例では、既存のファイルのためノーチェックでシナトラを実行しているcurrectディレクトリにそれを書いている 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

は、多かれ少なかれ、私はこのような何かをしたいです。

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

+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 

へのファイルの書き込みになります、あなたは彼がに(readed)開かれていないため、ファイルのサイズを気にする必要はありません。重要なブロッカーをスキップしてtempディレクトリから正しい場所に移動しました。実際には、PHPコードは、同じものを行う1kの塊でファイルを読んで、新しいファイルに格納するが、そのファイルは、その無意味なので、以来。 あなたはベンの答えに従うことができますしようとする。