2012-08-28 36 views
1

我正在使用節點和node-ftp模塊。我需要上傳兩個文件到另一個服務器,我可以上傳一個文件,但是當我嘗試上傳兩個文件時,它會拋出錯誤。根據他們的API無法使用FTPClient node.js模塊上傳兩個或更多文件

,這是發送一個文件

var fs = require('fs'); 
conn.put(fs.createReadStream('/var/www/videoComplete/'+ videoID +'.flv'), '/home/wowza/content/'+ videoID +'.flv', function(e) { 
    console.log(fileName + '.flv uploaded to Streaming Server :)'); 
    conn.end(); 
}); 

的正常工作的代碼,但如果我想要做的兩種文件我以爲我會只是重複的功能,但它贏得沒有工作。有誰知道如何使用FTPClient

這裏給兩個或多個文件是我試圖執行

conn = new FTPClient({ host: 'serverIP' }); 
conn.on('connect', function() { 
    conn.auth('user', 'pass', function(e) { 
    if (e) throw e; 
    var fs = require('fs'); 

    conn.put(fs.createReadStream('/var/www/ce-videoComplete/'+ videoID +'.flv'), '/home/wowza/content/'+ videoID +'.flv', function(e) { 
     console.log(fileName + '.flv uploaded to Streaming Server :)'); 
     conn.end(); 
    }); 

    conn.put(fs.createReadStream('/var/www/ce-thumbnails/'+ videoID +'.jpg'), '/var/www/html/thumbnails/'+ videoID +'.jpg', function(e) { 
     console.log(fileName + '.jpg uploaded to Streaming Server :)'); 
     conn.end(); 
    }); 

    }); 
}); 
conn.connect(); 

更新的代碼:我想這是很好,但它不會重新連接。

conn.put(fs.createReadStream('/var/www/ce-videoComplete/'+ videoID +'.flv'), '/home/wowza/content/'+ videoID +'.flv', function(e) { 
    console.log(fileName + '.flv uploaded to Streaming Server :)'); 
    conn.end(); 

    conn.put(fs.createReadStream('/var/www/ce-thumbnails/'+ videoID +'.jpg'), '/var/www/html/thumbnails/'+ videoID +'.jpg', function(e) { 
    console.log(fileName + '.jpg uploaded to Streaming Server :)'); 
    conn.end(); 
    }); 
}); 
+0

你的代碼是兩個文件同時上傳了這是不是FTP支持一個連接。嘗試在第一個回調中放置第二個'conn.put'。 – JohnnyHK

+0

我剛剛嘗試了你的建議,這很有道理,所以我將})從第一次回調後第二次回調,它上傳第一個文件,但似乎沒有在第二次運行下一個conn.put想法?我發佈了我上面嘗試過的代碼。 –

+0

你不覺得知道拋出哪個錯誤是有道理的嗎? (在你的回調函數中使用'if(e)console.error(e);')。在第一次文件上傳之後(聽取適當的事件),還要確保連接沒有關閉/錯誤/結束/等等。如果操作不可用,'put'也立即返回'false'。 – elmigranto

回答

2

直到兩個文件串聯上傳不要斷開連接:

conn.put(fs.createReadStream('/var/www/ce-videoComplete/'+ videoID +'.flv'), 
    '/home/wowza/content/'+ videoID +'.flv', 
    function(e) { 
     console.log(fileName + '.flv uploaded to Streaming Server :)'); 

     conn.put(fs.createReadStream('/var/www/ce-thumbnails/'+ videoID +'.jpg'), 
      '/var/www/html/thumbnails/'+ videoID +'.jpg', 
      function(e) { 
       console.log(fileName + '.jpg uploaded to Streaming Server :)'); 
       // Now that both files are uploaded, end the connection. 
       conn.end(); 
      }); 
     }); 
    } 
); 
+1

我應該注意到,在評論之前:)還有一件事 - @Thomas,使用[異步](https://github.com/caolan/async)或類似的lib。 – elmigranto

+0

謝謝!你們倆!有效。我希望這個模塊的作者在文檔中寫了更多的例子,至少在這個例子中使用了一個用戶名和密碼。但是,謝謝你們! –

+0

@ThomasDepole elmigranto在檢查回調中的'e'錯誤參數方面提供了一個很好的觀點。記錄可能會幫助你發現正在發生的事情。 – JohnnyHK

1

我的FTPimp筆者,這不同於其他任何節點FTP模塊,FTPimp有一個專有的隊列異步運行一切和順序,這樣就可以避免回調地獄和耦合依賴通過如下:

FTPimp.put

ftp.put(['/var/www/ce-videoComplete/'+ videoID +'.flv', '/home/wowza/content/'+ videoID +'.flv'], function (err, filename) { 
    console.log(fileName + 'uploaded to Streaming Server :)'); 
}); 
ftp.put(['var/www/ce-thumbnails/'+ videoID +'.jpg', '/var/www/html/thumbnails/'+ videoID +'.jpg'], function(err, filename) { 
    console.log(fileName + ' uploaded to Streaming Server :)'); 
    ftp.quit(); 
}); 

因爲FTPimp.put()通過文件名來回調,你的日誌是簡單一點,以及:)歡呼