2016-11-15 69 views
0

我正在編寫一個可以將文件上傳到存儲的Rails應用程序。大文件從客戶端(使用JS)分割成塊,並將部分上傳到服務器。連接字節 - 將文件作爲塊寫入FTP文件夾

在開發過程中,我可以簡單地打開已存在的文件並在其中寫入以下字節。

(我使用CarrierWave寶石)

File.open(@up_file.link.path, "ab") do |f| 
    f.write(up_file_params[:link].read) 
end 
# This code worked when I upload to '/public' folder in development 

不過,現在我想用一臺FTP服務器到存儲的文件。但是我不能用現有的字節連接新的字節。

def get_ftp_connection # create a new FTP connection 
    ftp = Net::FTP.new   
    ftp.connect(ENV['ftp_host'], ENV['ftp_port']) 

    begin 
     ftp.passive = ENV['ftp_passive'] 
     ftp.login(ENV['ftp_user'], ENV['ftp_passwd']) 

     yield ftp 
    ensure 
     ftp.quit 
    end 
end 

..... 
def create 
    ..... 
    get_ftp_connection @up_file do |ftp| 
     full_path = ::File.dirname "#{ENV['ftp_folder']}/#{@up_file.link.path}" 
     base_name = File.basename(@up_file.link.to_s) 
     ftp.chdir(full_path)     
     ftp.putbinaryfile(up_file_params[:link].read, base_name) 
    end 
end 

我在putbinaryfile...ArgumentError (string contains null byte):,任何幫助:(

+1

您可以將部件上傳到服務器上的臨時文件上傳完成後,將其放到FTP服務器上。 –

回答

0

正如在評論中提到,你可以完全先下載該文件,然後上傳到FTP服務器上。如果這不是出於某種原因的選項,您可以在遠程文件上傳時附加:

ftp.storbinary("APPE #{base_name}", up_file_params[:link], Net::FTP::DEFAULT_BLOCKSIZE)