我在Rails 2.3.5和
Ruby 1.8.6,并试图找出如何让用户通过我的Rails应用程序将文件上传到不同机器上的FTP服务器.此外,我的Rails应用程序将在Heroku上托管,这不便于将文件写入本地文件系统.
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
目前我只是想让Rails应用程序在我的Windows笔记本电脑上工作.使用上面的代码,我收到这个错误
Errno::ENOENT in FtpController#upload No such file or directory -.... followed by a dump of the file contents
解决方法
经过多次研究和总结,我最后阅读了用于putbinaryfile方法的源代码,以找出一个解决方法来限制putbinaryfile.这是工作代码,替换这一行
ftp.putbinaryfile(file.read,File.basename(file.original_filename))
同
ftp.storbinary("STOR " + file.original_filename,StringIO.new(file.read),Net::FTP::DEFAULT_BLOCKSIZE)
如果你想知道,STOR是一个原始的FTP命令,是这样的.我很惊讶,这种情况不是很容易被Ruby标准库处理,当然不是很明显需要做什么.
如果您的应用程序在Heroku上,请添加此行
ftp.passive = true
Heroku的防火墙设置不允许FTP活动模式,还要确保您的FTP服务器支持被动模式.