2010-04-25 11 views
12

पर रेल अपलोड फ़ाइल मैं रेल 2.3.5 और रूबी 1.8.6 पर हूं और यह पता लगाने की कोशिश कर रहा हूं कि उपयोगकर्ता को मेरे रेल ऐप के माध्यम से एक अलग मशीन पर एक FTP सर्वर पर फ़ाइल अपलोड करने दें। इसके अलावा मेरा रेल ऐप हेरोोकू पर होस्ट किया जाएगा जो स्थानीय फाइल सिस्टम में फाइलों के लेखन की सुविधा नहीं देता है।एफटीपी सर्वर

index.html.erb

<% form_tag '/ftp/upload', :method => :post, :multipart => true do %> 
<label for="file">File to Upload</label> <%= file_field_tag "file" %> 
<%= submit_tag 'Upload' %> 
<% end %> 

ftp_controller.rb

require 'net/ftp' 

class FtpController < ApplicationController 
    def upload 
    file = params[:file] 
    ftp = Net::FTP.new('remote-ftp-server') 
    ftp.login(user = "***", passwd = "***") 
    ftp.putbinaryfile(file.read, File.basename(file.original_filename)) 
    ftp.quit() 
    end 

    def index 
    end 

end 

वर्तमान में मैं बस अपना Windows लैपटॉप पर काम करने की रेल एप्लिकेशन पाने के लिए कोशिश कर रहा हूँ। इसके बाद के संस्करण कोड के साथ, मैं मैं एक CSV फ़ाइल अपलोड करने के लिए कि यदि कोई फर्क नहीं पड़ता कोशिश कर रहा हूँ इस त्रुटि

Errno::ENOENT in FtpController#upload 
No such file or directory -.... followed by a dump of the file contents 

हो रही है। किसी को पता है कि क्या हो रहा है?

उत्तर

18

काफी अनुसंधान और सिर की पिटाई के बाद, मैं putbinaryfile विधि putbinaryfile की सीमा का संभावित हल यह पता लगाने की के लिए स्रोत कोड को पढ़ने के समाप्त हो गया। यहाँ काम कर कोड है,

ftp.storbinary("STOR " + file.original_filename, StringIO.new(file.read), Net::FTP::DEFAULT_BLOCKSIZE) 

के साथ इस लाइन

ftp.putbinaryfile(file.read, File.basename(file.original_filename)) 

की जगह और मामले में आप सोच रहे हैं, STOR एक कच्चे एफ़टीपी आदेश है, हाँ यह है कि करने के लिए आया था। मुझे आश्चर्य है कि इस परिदृश्य को रूबी मानक पुस्तकालयों द्वारा आसानी से संभाला नहीं जा रहा है, यह निश्चित रूप से स्पष्ट नहीं था कि क्या करने की आवश्यकता है।

और यदि आपके एप्लिकेशन Heroku पर है, इस लाइन

ftp.passive = true 

Heroku के फ़ायरवॉल सेटअप एफ़टीपी सक्रिय मोड के लिए अनुमति नहीं है, यह भी सुनिश्चित करें कि आपके FTP सर्वर निष्क्रिय मोड का समर्थन करता है कि जोड़ें।

+0

'ftp.putbinaryfile (StringIO.new (file.read), file.original_filename, Net :: FTP :: DEFAULT_BLOCKSIZE)' काम करता है? –

+0

नहीं, जो काम नहीं करता है, त्रुटि को फेंकता है "स्ट्रिंगियो को स्ट्रिंग में परिवर्तित नहीं कर सकता"। – Bob

+0

अरे, क्या रेल 3 इसे किसी भी बेहतर तरीके से संभालता है? – fatfrog

1

मुझे लगता है कि ftp.putbinaryfile सिर्फ पहले पैरामीटर के रूप में फ़ाइल का पथ और नाम चाहता है।

+0

इसमें 2 अन्य अच्छे विकल्प हैं: http://stackoverflow.com/questions/5223763/how-to-ftp-in-ruby-without-first-saving-the-text-file – Josh

+0

पथ इसे काम करने के लिए पर्याप्त है । –

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