簡體   English   中英

Rails將文件上傳到ftp服務器

[英]Rails upload file to ftp server

我正在使用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

我正在嘗試上傳CSV文件,如果這有任何區別。 誰知道發生了什么?

經過大量研究和敲擊后,我最終閱讀了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服務器支持被動模式。

在我看來,ftp.putbinaryfile只想將文件的路徑和名稱作為第一個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM