2011-02-01 18 views
5

i yapabileceği Sinatra bu yöne kısa bir webcodersinatra ve http

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

bir dosya koymak için bukle kullanmak istediğiniz varsayalım PUT:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

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

nasıl ben akış dosyasını okuyabilir? sadece onları clobbering ... en temel örnek, mevcut dosyalar denetimi yapılmadan Sinatra çalıştıran currect dizinine yazıyor http://www.php.net/manual/en/features.file-upload.put-method.php#56985

+0

[Bu soru] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack), istediğinizi yapamayacağınızı ima eder, ancak henüz bilmiyorum Bunu cevap olarak yayınlamaya yetecek kadar yeter. – Phrogz

+0

@Phrogz Bunu yeni buldum: http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - ilginizi çekebileceğini düşündüm. – matt

cevap

4

:

az çok ben böyle bir şey istiyorum.

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

Ayrıca, bukle komuta dosya adı bölümünü kapalı bırakabilir ve bu dosya ile sizin için dolduracaktır. Düşman örnek: o açıldı (readed) değil çünkü

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

Bu şekilde http://localhost:4567/upload/file.txt

+0

Rota bloğu, istek bitene kadar çalışmayı bekler mi, yoksa sonuçların geldiği anda aktarılmasına izin veriyor mu? – Phrogz

+0

Akış hakkında bilmiyorum ... Bu ayrıntıyı özledim – 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 

dosyayı yazılı olarak sonuçlanacaktır, sen dosyanın boyutu hakkında endişelenmenize gerek yok Hafıza ancak geçici bir engelleyici atlama temp dizininden doğru yere taşındı. Aslında, php kodu aynı şeyi yapar, dosyayı 1k'lık parçalar halinde okur ve yeni bir dosyada saklar, ancak dosya aynı olduğundan, anlamsızdır. Denemek için Ben'in cevabını takip edebilirsiniz.