2011-02-01 12 views
5

लगता है मैं एक फ़ाइल एक वेब सेवा करने के लिए सिनात्रा में इस तरहसिनात्रा और http डाल

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

+0

[यह प्रश्न] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack) का तात्पर्य है कि आप जो चाहते हैं वह नहीं किया जा सकता है, लेकिन मुझे अभी तक पता नहीं है इसके बारे में पर्याप्त जानकारी सुनिश्चित करने के लिए पर्याप्त है। – Phrogz

+0

@ प्रागोज़ मुझे अभी यह मिला: http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - सोचा कि आपको रुचि हो सकती है। – matt

उत्तर

4

सबसे बुनियादी उदाहरण currect निर्देशिका आप मौजूदा फ़ाइलों के लिए कोई चेकिंग के साथ में सिनात्रा चल रहे हैं करने के लिए यह लिख रहा है ... सिर्फ उन्हें clobbering।

#!/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 -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 भाग में पढ़ते हैं और एक नई फ़ाइल में स्टोर करते हैं, लेकिन फ़ाइल के समान ही, इसकी व्यर्थ। कोशिश करने के लिए आप बेन के जवाब का पालन कर सकते हैं।

संबंधित मुद्दे