nodejs連接ftp上傳下載實(shí)現(xiàn)方法詳解【附:踩坑記錄】
依賴
//ftp 模塊是目前找到的還不錯的,對于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 : 這里提醒下,在本示例中的所有代碼都在同一個文件中,后面會給出完整示例代碼。
有了目錄切換,那么在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)對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 : '***',//這個就不提供啦 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)對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();
踩坑記錄:
筆者測試過程中發(fā)現(xiàn),有的ftp服務(wù)器傳輸速度正常,而有的ftp服務(wù)器傳輸速度則是非常慢!慢到平均一張十幾K的圖片都能傳十幾秒的程度!經(jīng)過檢查發(fā)現(xiàn),這類ftp是采用的被動連接模式。
對此,查找github官方文檔https://github.com/mscdex/node-ftp , 發(fā)現(xiàn)connect
函數(shù)中有一個pasvTimeout
選項(xiàng)涉及到被動連接超時設(shè)置,于是筆者測試了一下,將上面的連接代碼改成如下:
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 });
再次測試,傳輸速度慢的問題得到解決!
- nginx利用referer指令實(shí)現(xiàn)防盜鏈配置
- Nginx防盜鏈的配置方法
- Nginx服務(wù)器下防盜鏈的方法介紹
- Nginx圖片防盜鏈配置實(shí)例
- 配置Nginx的防盜鏈的操作方法
- nginx配置防盜鏈的三種實(shí)現(xiàn)方式總結(jié)
- node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地
- nodejs實(shí)現(xiàn)生成文件并在前端下載
- Node.js實(shí)現(xiàn)下載文件的兩種實(shí)用方式
- Node.js實(shí)現(xiàn)批量下載圖片簡單操作示例
- node.js突破nginx防盜鏈機(jī)制,下載圖片案例分析
相關(guān)文章
NodeJS 創(chuàng)建目錄和文件的方法實(shí)例分析
這篇文章主要介紹了NodeJS 創(chuàng)建目錄和文件的方法,涉及node.js中fs模塊mkdir、writeFile及目錄判斷existsSync等方法的功能與相關(guān)使用技巧,需要的朋友可以參考下2023-04-04node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地
這篇文章主要為大家介紹了node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06在?node?中使用?koa-multer?庫上傳文件的方式詳解
本文主要介紹了上傳單個文件、多個文件,文件數(shù)量大小限制、限制文件上傳類型和對上傳的圖片進(jìn)行不同大小的裁剪,對node使用?koa-multer?庫上傳文件相關(guān)知識感興趣的朋友一起看看吧2024-01-01Nginx設(shè)置為Node.js的前端服務(wù)器方法總結(jié)
在本篇文章中小編給大家分享了關(guān)于Nginx設(shè)置為Node.js的前端服務(wù)器的方法和實(shí)例,需要的朋友們學(xué)習(xí)下。2019-03-03node.js 用socket實(shí)現(xiàn)聊天的示例代碼
本篇文章主要介紹了node.js 用socket實(shí)現(xiàn)聊天的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10