nodejs連接ftp上傳下載實(shí)現(xiàn)方法詳解【附:踩坑記錄】
依賴(lài)
//ftp 模塊是目前找到的還不錯(cuò)的,對(duì)于ftp的基本功能都支持 npm install ftp
連接ftp
const ftp = require('ftp');//連接FTP
const client = new ftp();
client.on('ready',()=>{
console.log('ftp client is ready');
});
client.connect({
host : '***.***.***.***',
port : '****',
user : '***',
password : '***',
keepalive : 1000
});
ftp 獲取列表 list
//列出目標(biāo)目錄
function list(dirpath){
return new Promise((resolve,reject)=>{
client.list((err,files)=>{
resolve({err : err,files : files});
})
});
}
async function test (){
//list 列表功能
let {err,files} = await list();
if(err){
console.log(err);
return
}
console.log(`獲得文件列表:`+files.length);
console.log(files);
}
test();

ftp 目錄切換
//切換目錄
function cwd(dirpath){
return new Promise((resolve,reject)=>{
client.cwd(dirpath,(err,dir)=>{
resolve({err : err,dir : dir});
})
});
}
FBI WARNING : 這里提醒下,在本示例中的所有代碼都在同一個(gè)文件中,后面會(huì)給出完整示例代碼。
有了目錄切換,那么在list函數(shù)中的dirpath就可以使用啦。如下:
//列出目標(biāo)目錄
//列出目標(biāo)目錄
async function list(dirpath){
let {err : ea,dir } = await cwd(dirpath);
return new Promise((resolve,reject)=>{
client.list((err,files)=>{
resolve({err : err,files : files})
})
});
}
ftp下載文件
//下載文件
async function get(filePath){
const dirpath = path.dirname(filePath);
const fileName = path.basename(filePath);
let {err : ea,dir} = await cwd(dirpath);
return new Promise((resolve,reject)=>{
client.get(fileName,(err,rs)=>{
let ws = fs.createWriteStream(fileName);
rs.pipe(ws);
resolve({err : err});
});
});
}
ftp上傳文件
//將文件上傳到ftp目標(biāo)地址
async function put(currentFile,targetFilePath){
const dirpath = path.dirname(targetFilePath);
const fileName = path.basename(targetFilePath);
const rs = fs.createReadStream(currentFile);
let {err : ea,dir} = await cwd(dirpath);//此處應(yīng)對(duì)err做處理
if(ea){
return Promise.resolve({err : ea});
}
return new Promise((resolve,reject)=>{
client.put(rs,fileName,(err)=>{
resolve({err : err});
})
});
}
完整代碼
const ftp = require('ftp');//連接FTP
const path = require('path');
const client = new ftp();
const fs = require('fs');
client.on('ready',()=>{
console.log('ftp client is ready');
});
client.on('close',()=>{
console.log('ftp client has close')
});
client.on('end',()=>{
console.log('ftp client has end')
});
client.on('error',(err)=>{
console.log('ftp client has an error : '+ JSON.stringify(err))
});
client.connect({
host : '***',//這個(gè)就不提供啦
port : '***',
user : '***',
password : '***',
keepalive : 1000
});
//列出目標(biāo)目錄
async function list(dirpath){
let {err : ea,dir } = await cwd(dirpath);
return new Promise((resolve,reject)=>{
client.list((err,files)=>{
resolve({err : err,files : files})
})
});
}
//切換目錄
function cwd(dirpath){
return new Promise((resolve,reject)=>{
client.cwd(dirpath,(err,dir)=>{
resolve({err : err,dir : dir});
})
});
}
//下載文件
async function get(filePath){
const dirpath = path.dirname(filePath);
const fileName = path.basename(filePath);
let {err : ea,dir} = await cwd(dirpath);
return new Promise((resolve,reject)=>{
client.get(fileName,(err,rs)=>{
let ws = fs.createWriteStream(fileName);
rs.pipe(ws);
resolve({err : err});
});
});
}
//將文件上傳到ftp目標(biāo)地址
async function put(currentFile,targetFilePath){
const dirpath = path.dirname(targetFilePath);
const fileName = path.basename(targetFilePath);
const rs = fs.createReadStream(currentFile);
let {err : ea,dir} = await cwd(dirpath);//此處應(yīng)對(duì)err做處理
if(ea){
return Promise.resolve({err : ea});
}
return new Promise((resolve,reject)=>{
client.put(rs,fileName,(err)=>{
resolve({err : err});
})
});
}
async function test (){
//list 列表功能
let {err,files} = await list('/attachment/byycampus/resource');
if(err){
console.log(err);
return
}
console.log(`獲得文件列表:`+files.length);
console.log(files);
//下載文件
let {err : ea} = await get('/attachment/byycampus/resource/201812/14/201812141035222541381967.jpg');
if(ea){
console.log(ea);
return;
}
console.log('文件下載成功')
//文件上傳
let {err : eb} = await put('201812141035222541381967.jpg','/attachment/a.jpg');
if(eb){
console.log(eb);
return;
}
console.log('文件上傳成功')
}
test();
踩坑記錄:
筆者測(cè)試過(guò)程中發(fā)現(xiàn),有的ftp服務(wù)器傳輸速度正常,而有的ftp服務(wù)器傳輸速度則是非常慢!慢到平均一張十幾K的圖片都能傳十幾秒的程度!經(jīng)過(guò)檢查發(fā)現(xiàn),這類(lèi)ftp是采用的被動(dòng)連接模式。
對(duì)此,查找github官方文檔https://github.com/mscdex/node-ftp , 發(fā)現(xiàn)connect函數(shù)中有一個(gè)pasvTimeout選項(xiàng)涉及到被動(dòng)連接超時(shí)設(shè)置,于是筆者測(cè)試了一下,將上面的連接代碼改成如下:
const ftp = require('ftp');//連接FTP
const client = new ftp();
client.on('ready',()=>{
console.log('ftp client is ready');
});
client.connect({
host : '***.***.***.***',
port : '****',
user : '***',
password : '***',
keepalive : 1000,
pasvTimeout:1000
});
再次測(cè)試,傳輸速度慢的問(wèn)題得到解決!
- nginx利用referer指令實(shí)現(xiàn)防盜鏈配置
- Nginx防盜鏈的配置方法
- Nginx服務(wù)器下防盜鏈的方法介紹
- Nginx圖片防盜鏈配置實(shí)例
- 配置Nginx的防盜鏈的操作方法
- Springboot四種事件監(jiān)聽(tīng)的實(shí)現(xiàn)方式詳解
- node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地
- nodejs實(shí)現(xiàn)生成文件并在前端下載
- Node.js實(shí)現(xiàn)下載文件的兩種實(shí)用方式
- Node.js實(shí)現(xiàn)批量下載圖片簡(jiǎn)單操作示例
- node.js突破nginx防盜鏈機(jī)制,下載圖片案例分析
相關(guān)文章
NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法
這篇文章主要介紹了NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法,簡(jiǎn)單講述了不可逆加密與密碼密文保存的原理并結(jié)合實(shí)例形式分析了nodejs相關(guān)加密操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-03-03
手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題
本篇文章主要介紹了手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Node.js基礎(chǔ)入門(mén)之模塊與npm包管理器使用詳解
Node.js是一個(gè)基于Chrome?V8引擎的JavaScript運(yùn)行時(shí)。類(lèi)似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的模塊與npm包管理器的使用,需要的可以參考一下2022-03-03
Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例
這篇文章主要介紹了Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞)
這篇文章主要介紹了Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞),本文講解的一般是連接字符串會(huì)時(shí)出的安全問(wèn)題情況,需要的朋友可以參考下2014-12-12
nodejs實(shí)現(xiàn)黑名單中間件設(shè)計(jì)
最近寫(xiě)的項(xiàng)目中涉及到防止灌水的功能,于是設(shè)計(jì)了黑名單中間件,跟大家分享一下,同時(shí)也希望大家有好的建議能夠拍磚.2014-06-06
package.json各個(gè)屬性說(shuō)明詳解
這篇文章主要介紹了package.json各個(gè)屬性說(shuō)明詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

