精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node.js 小知識 — 實現(xiàn)圖片上傳寫入磁盤的接口

開發(fā) 前端
開啟一個 Node.js 服務,指定路由 /upload/image 收到請求后調(diào)用 uploadImageHandler 方法,傳入 Request 對象。

 [[373386]]

一:開啟 Node.js 服務

開啟一個 Node.js 服務,指定路由 /upload/image 收到請求后調(diào)用 uploadImageHandler 方法,傳入 Request 對象。

  1. const http = require('http'); 
  2. const formidable = require('formidable'); 
  3. const fs = require('fs'); 
  4. const fsPromises = fs.promises; 
  5. const path = require('path'); 
  6. const PORT = process.env.PORT || 3000; 
  7. const server = http.createServer(async (req, res) => { 
  8.   if (req.url === '/upload/image' &&  req.method.toLocaleLowerCase() === 'post') { 
  9.     uploadImageHandler(req, res); 
  10.   } else { 
  11.    res.setHeader('statusCode', 404); 
  12.    res.end('Not found!'
  13.   } 
  14. }); 
  15. server.listen(PORT, () => { 
  16.   console.log(`server is listening at ${server.address().port}`); 
  17. }); 

二:處理圖片對象

formidable 是一個用來處理上傳文件、圖片等數(shù)據(jù)的 NPM 模塊,form.parse 是一個 callback 轉(zhuǎn)化為 Promise 便于處理。

Tips:拼接路徑時使用 path 模塊的 join 方法,它會將我們傳入的多個路徑參數(shù)拼接起來,因為 Linux、Windows 等不同的系統(tǒng)使用的符號是不同的,該方法會根據(jù)系統(tǒng)自行轉(zhuǎn)換處理。

  1. const uploadImageHandler = async (req, res) => { 
  2.   const form = new formidable.IncomingForm({ multiples: true });   
  3.   form.encoding = 'utf-8';   
  4.   form.maxFieldsSize = 1024 * 5;   
  5.   form.keepExtensions = true
  6.  
  7.   try { 
  8.     const { file } = await new Promise((resolve, reject) => {   
  9.       form.parse(req, (err, fields, file) => {   
  10.         if (err) {   
  11.           return reject(err);   
  12.         } 
  13.  
  14.          return resolve({ fields, file });   
  15.       });   
  16.     }); 
  17.     const { name: filename, path: sourcePath } = file.img; 
  18.     const destPath = path.join(__dirname, filename); 
  19.     console.log(`sourcePath: ${sourcePath}. destPath: ${destPath}`); 
  20.     await mv(sourcePath, destPath); 
  21.     console.log(`File ${filename} write success.`); 
  22.     res.writeHead(200, { 'Content-Type''application/json' }); 
  23.     res.end(JSON.stringify({ code: 'SUCCESS', message: `Upload success.`})); 
  24.   } catch (err) { 
  25.     console.error(`Move file failed with message: ${err.message}`); 
  26.     res.writeHead(200, { 'Content-Type''application/json' }); 
  27.     res.end(JSON.stringify({ code: 'ERROR', message: `${err.message}`})); 
  28.   } 

三:實現(xiàn) mv 方法

fs.rename 重命名文件

將上傳的圖片寫入本地目標路徑一種簡單的方法是使用 fs 模塊的 rename(sourcePath, destPath) 方法,該方法會異步的對 sourcePath 文件做重命名操作,使用如下所示:

  1. const mv = async (sourcePath, destPath) => { 
  2.  return fsPromises.rename(sourcePath, destPath); 
  3. }; 

cross-device link not permitted

在使用 fs.rename() 時還要注意 cross-device link not permitted 錯誤,參考 rename(2) — Linux manual page:

**EXDEV **oldpath and newpath are not on the same mounted filesystem. (Linux permits a filesystem to be mounted at multiple points, but rename() does not work across different mount points, even if the same filesystem is mounted on both.)

oldPath 和 newPath 不在同一掛載的文件系統(tǒng)上。(Linux 允許一個文件系統(tǒng)掛載到多個點,但是 rename() 無法跨不同的掛載點進行工作,即使相同的文件系統(tǒng)被掛載在兩個掛載點上。)

在 Windows 系統(tǒng)同樣會遇到此問題,參考 http://errorco.de/win32/winerror-h/error_not_same_device/0x80070011/

winerror.h 0x80070011 #define ERROR_NOT_SAME_DEVICE The system cannot move the file to a different disk drive.(系統(tǒng)無法移動文件到不同的磁盤驅(qū)動器。)

此處在 Windows 做下復現(xiàn),因為在使用 formidable 上傳文件時默認的目錄是操作系統(tǒng)的默認目錄 os.tmpdir(),在我的電腦上對應的是 C 盤下,當我使用 fs.rename() 將其重名為 F 盤時,就出現(xiàn)了以下報錯:

  1. C:\Users\ADMINI~1\AppData\Local\Temp\upload_3cc33e9403930347b89ea47e4045b940 F:\study\test\202366 
  2. [Error: EXDEV: cross-device link not permitted, rename 'C:\Users\ADMINI~1\AppData\Local\Temp\upload_3cc33e9403930347b89ea47e4045b940' -> 'F:\study\test\202366'] { 
  3.   errno: -4037, 
  4.   code: 'EXDEV'
  5.   syscall: 'rename'
  6.   path: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\upload_3cc33e9403930347b89ea47e4045b940'
  7.   dest: 'F:\\study\\test\\202366' 

設(shè)置源路徑與目標路徑在同一磁盤分區(qū)

設(shè)置上傳文件中間件的臨時路徑為最終寫入文件的磁盤分區(qū),例如我們在 Windows 測試時將圖片保存在 F 盤下,所以設(shè)置 formidable 的 form 對象的 uploadDir 屬性為 F 盤,如下所示:

  1. const form = new formidable.IncomingForm({ multiples: true });   
  2. form.uploadDir = 'F:\\' 
  3. form.parse(req, (err, fields, file) => {   
  4.   ... 
  5. }); 

這種方式有一定局限性,如果寫入的位置位于不同的磁盤空間該怎么辦呢?

可以看下下面的這種方式。

讀取-寫入-刪除臨時文件

一種可行的辦法是讀取臨時文件寫入到新的位置,最后在刪除臨時文件。所以下述代碼創(chuàng)建了可讀流與可寫流對象,使用 pipe 以管道的方式將數(shù)據(jù)寫入新的位置,最后調(diào)用 fs 模塊的 unlink 方法刪除臨時文件。

  1. const mv = async (sourcePath, destPath) => { 
  2.   try { 
  3.     await fsPromises.rename(sourcePath, destPath); 
  4.   } catch (error) { 
  5.     if (error.code === 'EXDEV') { 
  6.       const readStream = fs.createReadStream(sourcePath);   
  7.       const writeStream = fs.createWriteStream(destPath); 
  8.       return new Promise((resolve, reject) => { 
  9.         readStream.pipe(writeStream); 
  10.         readStream.on('end', onClose); 
  11.         readStream.on('error', onError); 
  12.         async function onClose() { 
  13.           await fsPromises.unlink(sourcePath); 
  14.           resolve(); 
  15.         } 
  16.         function onError(err) { 
  17.           console.error(`File write failed with message: ${err.message}`);   
  18.           writeStream.close(); 
  19.           reject(err) 
  20.         } 
  21.       }) 
  22.     } 
  23.  
  24.     throw error; 
  25.   } 

四:測試

方式一:終端調(diào)用

  1. curl --location --request POST 'localhost:3000/upload/image' \ 
  2. --form 'img=@/Users/Downloads/五月君.jpeg' 

方式二:POSTMAN 調(diào)用

Reference

  • https://github.com/andrewrk/node-mv/blob/master/index.js
  • https://stackoverflow.com/questions/43206198/what-does-the-exdev-cross-device-link-not-permitted-error-mean/43206506#43206506
  • https://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback

本文轉(zhuǎn)載自微信公眾號「 Nodejs技術(shù)棧  」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 Nodejs技術(shù)棧公眾號。

 

責任編輯:武曉燕 來源: Nodejs技術(shù)棧
相關(guān)推薦

2011-09-08 14:16:12

Node.js

2021-03-09 08:03:21

Node.js 線程JavaScript

2025-05-26 00:31:31

2021-09-26 22:22:42

js模塊Node

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2021-12-25 22:29:57

Node.js 微任務處理事件循環(huán)

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-07-16 04:56:03

NodejsAddon

2011-09-02 14:47:48

Node

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2014-11-04 09:54:00

Node.jsWeb

2011-10-25 09:28:30

Node.js

2025-07-21 01:00:00

UDP性能QPS

2021-11-06 18:40:27

js底層模塊
點贊
收藏

51CTO技術(shù)棧公眾號

日韩高清在线观看| 国产精品毛片久久久久久久久久99999999 | 日韩精品久久久久久福利| 男人添女人荫蒂免费视频| 天天干视频在线观看| 久久精品亚洲| 久久视频在线播放| av无码av天天av天天爽| 久久青青视频| 亚洲男人都懂的| 久久久久久国产精品一区| 日本一区二区三区免费看| 婷婷免费在线观看| 日韩专区av| 久久久久久久久久久电影| 成人精品福利视频| 国产视频91在线| 五月开心六月丁香综合色啪| 亚洲国产免费av| 日本在线观看视频一区| 欧美freesex| 亚洲资源中文字幕| 亚洲欧洲日韩综合二区| 亚洲国产精彩视频| 蜜桃在线一区二区三区| 韩国美女主播一区| 国产老头老太做爰视频| 亚洲欧洲美洲国产香蕉| 精品欧美黑人一区二区三区| 黄色片视频在线| 依依综合在线| 午夜视频在线观看一区| 美女在线免费视频| 伊人免费在线| 久久久美女艺术照精彩视频福利播放| 国产精品v欧美精品∨日韩| 中文字幕在线观看精品| 麻豆久久精品| 91高清视频免费| 极品颜值美女露脸啪啪| 四虎8848精品成人免费网站| 国产小视频91| 国产传媒第一页| 日韩av网址大全| 亚洲电影免费观看高清| 女教师高潮黄又色视频| 精品成人18| 91精品国产综合久久香蕉的特点 | 欧美成人短视频| 国产不卡av一区二区| 日韩激情在线视频| 亚洲天堂男人的天堂| 加勒比海盗1在线观看免费国语版| 国内在线精品| 国产亚洲欧美一区在线观看| 欧美一区二区三区成人久久片| 午夜视频福利在线| 91色综合久久久久婷婷| 久久久人人爽| 免费在线黄色影片| 欧美激情一二三区| 在线观看日本一区| www免费在线观看| 一区二区三区四区亚洲| 欧美无砖专区免费| 极品在线视频| 色先锋aa成人| 国产美女18xxxx免费视频| 日本午夜免费一区二区| 欧美一区二区三区性视频| 中国老熟女重囗味hdxx| 久久电影在线| 亚洲人成网站色ww在线| 欧美a级片免费看| 影音先锋日韩在线| 久久露脸国产精品| 无码人妻一区二区三区免费| 美国欧美日韩国产在线播放| 91免费欧美精品| 亚洲乱熟女一区二区| 91丝袜国产在线播放| 日韩hmxxxx| 2020国产在线视频| 欧美日韩国产在线| 亚洲无吗一区二区三区| 高清在线一区二区| 亚洲精品av在线| 日本成人免费在线观看| 欧美激情视频一区二区三区免费| 性亚洲最疯狂xxxx高清| 免费av中文字幕| 国产精品系列在线观看| 蜜桃久久精品乱码一区二区| 免费在线观看av| 午夜私人影院久久久久| 高潮一区二区三区| 777久久精品| 国产一区二区三区精品久久久| 在线免费看av网站| 国产欧美日韩一区二区三区在线| 国产精品99久久久久久久久| www黄色网址| 国产视频在线观看一区二区三区| 正在播放久久| 超碰超碰人人人人精品| 91精品国产色综合久久| 熟女少妇一区二区三区| 欧美一区精品| 国产精品久久久久久久美男| 欧美一级性视频| 国产精品视频在线看| 久久亚洲中文字幕无码| 精品国产不卡一区二区| 亚洲午夜国产成人av电影男同| 青青草在线观看视频| 日本亚洲欧美天堂免费| 国产精品一区二| 大片免费在线观看| 欧美三级电影在线观看| 波多野结衣福利| 在线精品一区二区| 91久久久久久久久久| 啊v在线视频| 狠狠干狠狠久久| 一级黄色电影片| 91av精品| 91精品国产综合久久香蕉| 免费a在线观看| 天天色图综合网| 逼特逼视频在线观看| 欧美一区激情| 亚洲综合中文字幕在线观看| 日本黄色片在线观看| 色哟哟一区二区三区| 中文在线一区二区三区| 亚洲一级黄色| 成人9ⅰ免费影视网站| 美女av在线播放| 欧美日韩在线三区| 一区二区伦理片| 久久精品在线| 六十路精品视频| eeuss鲁一区二区三区| 日韩欧美第一区| 欧美日韩三级在线观看| 狠狠色丁香婷综合久久| 国产成人精品免费看在线播放| 欧美大片网站| 久久精品亚洲一区| 国产精品一区二区av白丝下载 | 日本美女一区二区| 日本一区美女| 成人亚洲免费| xxav国产精品美女主播| 国产欧美一级片| 亚洲精品少妇30p| 久久av一区二区三| 在线免费高清一区二区三区| 激情视频一区二区| 悠悠资源网亚洲青| 国产亚洲欧洲高清| 伊人久久一区二区| 亚洲免费视频中文字幕| 欧美一级大片免费看| 亚洲久久一区二区| 日本欧美精品久久久| 国产成人精品一区二区三区视频| 久久久999国产精品| www.激情五月.com| 午夜精品久久久久| 人人妻人人藻人人爽欧美一区| 日韩黄色免费电影| 亚洲自拍偷拍一区二区三区| 91精品久久久久久综合五月天| 午夜美女久久久久爽久久| 美女毛片在线看| 欧美日韩国产在线播放网站| 中文字幕在线观看成人 | www亚洲色图| 国产综合色在线| 免费在线观看视频a| 精品一区在线| 91亚洲国产成人精品性色| 美洲精品一卡2卡三卡4卡四卡| 日韩高清av一区二区三区| 亚洲国产无线乱码在线观看| 亚洲精品成人a在线观看| 香蕉av福利精品导航| 91香蕉视频污版| 一区二区三区四区在线观看国产日韩 | 欧美黄色a视频| 欧美激情精品久久久久久大尺度| 三级视频网站在线| 欧美精品国产精品| 日本三级片在线观看| 欧美激情综合网| 免费观看污网站| 老司机精品视频导航| 野外做受又硬又粗又大视频√| 国产一区二区精品久| 亚洲va欧美va在线观看| 成人性生交大片免费网站| 精品激情国产视频| 亚洲av毛片成人精品| 欧美一区欧美二区| 国产一级片av| 亚洲国产aⅴ天堂久久| 性少妇xx生活| 久久亚洲二区三区| 国模大尺度视频| 久久精品国产色蜜蜜麻豆| 成人av一级片| 国产在线欧美| 黄色一级片网址| 欧美综合在线视频观看| 精品在线视频一区二区| 麻豆精品一区| 国产在线精品一区免费香蕉| 在线最新版中文在线| 欧美激情视频网站| 黄色一级片在线观看| 亚洲午夜未删减在线观看| 亚欧洲精品视频| 欧美精品一区二区三| 国产强伦人妻毛片| 欧美日韩国产精品自在自线| 久久久久久久亚洲| 欧美性猛交xxxx乱大交蜜桃| 国产大片中文字幕| 一区二区三区在线影院| 娇小11一12╳yⅹ╳毛片| 日本一区二区免费在线| 中文字字幕码一二三区| 国产91露脸合集magnet| 日韩欧美中文视频| 精品一区二区在线免费观看| 激情 小说 亚洲 图片: 伦| 老鸭窝91久久精品色噜噜导演| 久青草视频在线播放| 欧美午夜免费影院| 日韩在线视频在线| 国内揄拍国内精品久久| 免费的一级黄色片| 欧美色综合网| 久久亚洲国产成人精品无码区| 中国成人一区| 一二三四中文字幕| 午夜久久久久| 又大又硬又爽免费视频| 亚洲小说欧美另类婷婷| 三上悠亚久久精品| 一本一道久久综合狠狠老精东影业| 超碰成人免费在线| 99热免费精品| 超碰网在线观看| 日韩av高清在线观看| 超碰在线公开97| 韩国毛片一区二区三区| 91精产国品一二三| 丁香五精品蜜臀久久久久99网站 | 国产欧美久久久| 日韩三级免费观看| 人妻无码中文字幕| 亚洲精品视频二区| a天堂在线资源| 久久手机免费视频| 黑人玩欧美人三根一起进| 91国产美女在线观看| 欧美日韩免费看片| 成人美女av在线直播| caoporn成人免费视频在线| 韩国成人动漫在线观看| 久久不见久久见中文字幕免费| 亚洲黄色成人久久久| 你懂的网址国产 欧美| 黄色成人在线看| 免费成人你懂的| 国产ts在线观看| 久久久噜噜噜久久人人看| 日韩在线不卡av| 亚洲线精品一区二区三区八戒| 成人精品在线看| 欧美日韩在线观看一区二区| 国产黄色免费大片| 亚洲毛片在线观看.| 精品美女在线观看视频在线观看| 久久久久免费精品国产| 老司机2019福利精品视频导航| 成人美女av在线直播| 香蕉久久夜色精品国产更新时间| 一区二区在线中文字幕电影视频| 一区在线视频观看| 99视频在线视频| 丁香另类激情小说| 国产极品视频在线观看| 亚洲风情在线资源站| 中文字幕av资源| 亚洲精品一区二区三区99| 日本三级在线视频| 2021国产精品视频| 国产激情一区| 日韩精品久久久免费观看| 欧美亚韩一区| www.精品在线| 久久综合一区二区| 久久精品一级片| 欧美日韩一二三| 天堂av电影在线观看| 欧美老妇交乱视频| 91精品美女| 六十路精品视频| 黑丝一区二区三区| 国产传媒免费观看| 国产午夜精品福利| 自拍偷拍欧美亚洲| 日韩欧美国产高清| 麻豆视频在线观看免费| 国产aaa精品| 成人性生交大片免费看中文视频| 中文字幕中文字幕99 | 国产精品18久久久久久麻辣| 超碰地址久久| av电影一区二区三区| 日韩高清不卡一区| 五级黄高潮片90分钟视频| 亚洲国产视频一区| 亚洲AV午夜精品| 欧美成人中文字幕| 精品麻豆剧传媒av国产九九九| 神马影院我不卡| 水蜜桃久久夜色精品一区的特点| 中文字幕免费高清视频| 亚洲国产欧美一区二区三区丁香婷| 一二三四区视频| 亚洲色图av在线| 综合另类专区| 欧美在线3区| 免费看亚洲片| 国产呦小j女精品视频| 色综合天天做天天爱| 亚洲欧美丝袜中文综合| 91精品国产色综合久久不卡98| 精品在线网站观看| 欧美视频免费看欧美视频| 成人免费黄色大片| 国产精品23p| 亚洲精品黄网在线观看| 国产福利电影在线播放| 久久精品国产综合精品| 国产亚洲午夜| 天天躁日日躁aaaxxⅹ | 性做久久久久久久久久| 久久99精品久久久久久噜噜| 精品国产三级| 成人免费a级片| 成人涩涩免费视频| 日本中文字幕免费观看| 亚洲国产精品福利| 在线视频超级| 亚洲欧美日韩在线综合| 九九久久精品视频| 久久精品黄色片| 亚洲成年人在线播放| 色在线视频观看| 日韩欧美视频一区二区| 美女视频一区在线观看| 好吊日在线视频| 精品国产乱码久久久久久浪潮| 精品丝袜在线| 日本一区免费看| 男人的j进女人的j一区| 免费成年人视频在线观看| 日韩女优电影在线观看| 成人观看网址| 亚洲高清视频一区二区| 国产精品伊人色| 97人人澡人人爽人人模亚洲 | av中文字幕在线播放| 国产精品swag| 日本不卡视频在线| 午夜69成人做爰视频| 日韩av一区在线| 国精品产品一区| 黄色三级中文字幕| 久久嫩草精品久久久精品一| 国产理论片在线观看| 97在线视频免费观看| 日韩专区精品| 欧美xxxxx少妇| 欧美三级电影在线看| heyzo一区| 亚洲欧美日韩国产成人综合一二三区| 国产91精品欧美| 少妇又紧又色又爽又刺激视频 | 国产大陆精品国产| 中文在线第一页| 欧美成年人网站| 九九视频免费观看视频精品| 中文字幕第一页在线视频| 精品国产91久久久|