精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲国产无线乱码在线观看| 午夜剧场免费看| 69av在线| 国产麻豆91精品| 国内精品小视频| 美女被到爽高潮视频| 欧美日韩va| 亚洲一区二区三区小说| 欧美大香线蕉线伊人久久| 欧美激情一区二区三区免费观看| 99免费精品| 亚洲国产精品久久| 中文字幕视频在线免费观看| 1区2区在线观看| 99精品1区2区| 成人精品一区二区三区| 国产成人精品片| 欧美激情国产在线| 国产网站欧美日韩免费精品在线观看 | 国产精品久久影院| 久久av一区二区三区亚洲| 中文字幕男人天堂| 亚洲一区免费| 九九精品在线播放| 你懂得视频在线观看| 女仆av观看一区| 日韩限制级电影在线观看| av免费中文字幕| 亚洲综合影视| 中文乱码免费一区二区 | 性欧美lx╳lx╳| 欧美不卡激情三级在线观看| 欧美成年人视频在线观看| 欧美aa在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 国产伦精品一区二区三区四区| 在线一区视频| 久久久久久久影院| 欧美丰满熟妇bbbbbb| 欧美精品一区二区三区精品| 亚洲国产福利在线| 亚洲精品久久久久久| 青青伊人久久| 欧美四级电影网| 日韩无套无码精品| 在线天堂资源| 福利一区福利二区微拍刺激| 国产精品专区在线| 中文字幕在线播放网址| 国产精品国产三级国产普通话蜜臀 | 波多野结衣一二区| 国产毛片一区| 91国在线精品国内播放| 国产无精乱码一区二区三区| 你懂的成人av| 免费不卡欧美自拍视频| 日韩三级久久久| 日韩情爱电影在线观看| 中文字幕欧美日韩| 特级西西人体高清大胆| 精品日韩免费| zzijzzij亚洲日本成熟少妇| 国产又黄又粗又猛又爽的| 成人在线国产| 一区二区福利视频| а天堂中文在线资源| 成人免费电影网址| 精品国产一区二区三区久久狼黑人 | 成人免费性视频| 91超碰在线| 欧美性猛交xxxx富婆弯腰| 国产真实乱子伦| 免费污视频在线一区| 欧美在线制服丝袜| 中文字幕 欧美日韩| 国产激情精品一区二区三区| 日韩欧美色综合网站| 一级黄色片毛片| 日韩系列在线| 日韩中文视频免费在线观看| 欧美色图亚洲视频| 91久久夜色精品国产九色| 91sa在线看| 精品人妻一区二区三区潮喷在线 | 少妇高潮久久久| 26uuu亚洲综合色欧美| 日本午夜精品一区二区| 瑟瑟视频在线| 亚洲网友自拍偷拍| 日本精品免费在线观看| 日韩一区二区三区免费视频| 91精品国产一区二区三区香蕉| 色婷婷狠狠18禁久久| 欧美三级自拍| 日韩网站免费观看高清| 国产极品在线播放| 视频一区二区三区中文字幕| 成人字幕网zmw| 天天在线女人的天堂视频| 欧美国产日韩a欧美在线观看| 国产精品12p| 欧美亚洲日本精品| 91精品综合久久久久久| 国模私拍在线观看| 久久久国产精品| 91精品国产高清久久久久久久久 | 牛牛精品一区二区| 欧美日韩和欧美的一区二区| 大桥未久恸哭の女教师| jizzjizz欧美69巨大| 欧美国产日韩一区二区| 超碰在线97观看| 成人sese在线| 亚洲综合av一区| 天堂网在线最新版www中文网| 欧美日韩二区三区| 波多野结衣 在线| 午夜精品av| 国产精品网址在线| 三级毛片在线免费看| 亚洲激情男女视频| 成年人三级黄色片| 久操国产精品| 91精品国产99| 丰满熟妇人妻中文字幕| 中文欧美字幕免费| 草草草在线视频| www.国产精品一区| 久久久国产成人精品| 波多野结衣一区二区三区在线 | 成人性生交大免费看| 欧美日韩综合| 91精品天堂| 又爽又大又黄a级毛片在线视频| 欧美日韩国产影院| 折磨小男生性器羞耻的故事| 久久久久国产| 国产免费一区二区三区在线观看 | 麻豆精品在线| 色伦专区97中文字幕| 天堂网免费视频| 久久综合色8888| 国产手机免费视频| 精品亚洲精品| 97碰碰碰免费色视频| 亚洲黄色一级大片| 一区二区三区高清在线| 国产伦精品一区二区三区妓女下载 | 欧洲亚洲一区二区三区四区五区| 1区2区3区在线| 亚洲国产成人av在线| 久久亚洲av午夜福利精品一区| 国产精品66部| 成人免费在线视频播放| 深夜激情久久| 久久青草精品视频免费观看| 懂色av蜜臀av粉嫩av分享吧| 亚洲成人免费视| 国产一卡二卡三卡四卡| 亚洲国产裸拍裸体视频在线观看乱了中文| 99影视tv| 国产网站在线| 亚洲精品自产拍| 少妇一级淫片日本| 中文字幕日本乱码精品影院| 中文字幕一区二区三区四| 亚洲午夜精品一区 二区 三区| 亚洲已满18点击进入在线看片 | 成人av国产| 成人免费看黄网站| 欧美aaaaaaa| 亚洲欧美制服丝袜| 姑娘第5集在线观看免费好剧| 国产精品麻豆欧美日韩ww| 中文字幕 欧美日韩| 国语精品一区| 欧美亚洲精品日韩| 亚洲午夜国产成人| 欧美高清不卡在线| 日本精品专区| 欧美精品xxxxbbbb| 国产乡下妇女做爰视频| 久久久99精品久久| 免费高清视频在线观看| 日韩视频中文| 亚洲国产高清国产精品| 欧美影院视频| 日韩av电影免费观看高清| yjizz视频网站在线播放| 91精品在线麻豆| a v视频在线观看| 国产精品久久久一本精品| 韩国三级在线看| 日本在线不卡视频| 少妇一晚三次一区二区三区| 久久不卡国产精品一区二区| 91啪国产在线| 激情开心成人网| 欧美黄色片视频| av在线资源站| 日韩成人免费视频| 国产内射老熟女aaaa∵| 欧美午夜女人视频在线| 夫妻性生活毛片| 久久精品人人做人人爽人人| 黄色片免费网址| 天堂蜜桃一区二区三区| 成人国产在线看| 日韩欧美伦理| 久热国产精品视频一区二区三区| 国产在线不卡一区二区三区| 热久久免费视频精品| 视频在线观看入口黄最新永久免费国产 | 91国内在线视频| 亚洲91av| 日韩中文字幕网址| 久草视频视频在线播放| 精品久久久久久综合日本欧美 | 日韩精品影音先锋| 夜夜躁狠狠躁日日躁av| 精品久久久久久久久久| 青青草成人免费| 国产精品的网站| 色欲狠狠躁天天躁无码中文字幕 | 蜜桃视频在线观看www社区| 国产视频久久久久久久| 成人免费公开视频| 日韩视频免费观看高清完整版| 亚洲天堂五月天| 日韩欧美在线视频免费观看| 免费视频一二三区| 亚洲精品一二三区| 日日噜噜夜夜狠狠久久波多野| 国产视频亚洲色图| 91精品人妻一区二区三区蜜桃欧美| 高潮精品一区videoshd| 九九久久久久久| 久久99精品国产.久久久久久| 欧美自拍小视频| 三级精品在线观看| 激情婷婷综合网| 午夜一级久久| 久久精品99国产| 午夜在线播放视频欧美| 欧美日韩亚洲一| 亚洲一区二区三区四区五区午夜| 中国丰满熟妇xxxx性| 欧美在线精品一区| 国产欧美123| 最新精品国产| 国产一区二区四区| 亚洲高清自拍| 日韩欧美一区二| 国产日韩高清一区二区三区在线| www..com日韩| 国产亚洲激情| 日韩av播放器| 老色鬼精品视频在线观看播放| 亚洲无吗一区二区三区| 麻豆精品精品国产自在97香蕉 | 成熟亚洲日本毛茸茸凸凹| 在线观看欧美一区二区| 国产成人免费视频网站高清观看视频| 日本中文字幕在线不卡| 国产精品1区2区| 麻豆精品国产传媒av| 99久久国产综合精品麻豆| 中文字幕丰满孑伦无码专区| 久久日一线二线三线suv| 午夜时刻免费入口| 亚洲同性gay激情无套| 九九久久免费视频| 黄色精品在线看| 欧美激情一区二区三区免费观看| 91精品一区二区三区久久久久久| a级片免费观看| 日韩精品福利网站| 999在线视频| 欧美丰满老妇厨房牲生活| 第一福利在线视频| 国产精品电影久久久久电影网| 欧美a一级片| 国产乱码精品一区二区三区不卡| 亚洲区小说区图片区qvod| 亚洲精品日韩精品| 欧美日韩国产色综合一二三四| 免费在线观看亚洲视频| 蜜桃av一区二区| 亚洲色图欧美日韩| 欧美经典一区二区三区| 精品午夜福利在线观看| 色网站国产精品| 午夜老司机福利| 亚洲人成电影在线| 手机在线免费看av| 国产精品久久久久久久久久久久久| 国产电影一区二区| 欧美一区少妇| 欧美午夜国产| 午夜久久久精品| 成人97人人超碰人人99| 你懂得视频在线观看| 精品久久久视频| aaaa一级片| 中文字幕亚洲天堂| 欧美极品videos大乳护士| 成人免费视频网| 国产欧美日韩精品高清二区综合区| 今天免费高清在线观看国语| 久久蜜桃资源一区二区老牛| 久久av一区二区三| 国产精品不卡一区| 日本一区二区免费电影| 日韩免费观看高清完整版在线观看| 狠狠色伊人亚洲综合网站l| 欧美精品videosex性欧美| 日本中文字幕视频一区| 久久一区二区三区av| 欧美日韩专区| 亚洲自拍第三页| 国产精品美女久久久久久久久 | 欧美日韩三级视频| 欧美69xxxxx| 久久久免费精品| 日本一区二区三区电影免费观看| 亚洲国产一区二区三区在线播 | 亚洲午夜免费电影| 国产老女人乱淫免费| 中文字幕亚洲第一| 成人国产精品入口免费视频| 欧美日韩国产精品一卡| 99精品福利视频| 在线免费看黄色片| 亚洲一区二区三区自拍| 国产三级按摩推拿按摩| 日韩在线观看免费全| 国产成人a视频高清在线观看| 日本不卡二区高清三区| 免费在线成人| 91精品人妻一区二区| 欧美丝袜美女中出在线| 亚洲欧洲精品视频| 欧美一区二区三区免费视| 欧美亚洲色图校园春色| 成年人午夜视频在线观看| 成人国产精品免费网站| 国产精品suv一区二区69| 精品国产免费人成电影在线观看四季 | 欧美第一在线视频| 69精品丰满人妻无码视频a片| 精品一区二区三区在线播放视频| 婷婷丁香综合网| 欧美日韩高清一区二区三区| 黄色网页在线观看| 亚洲一区免费网站| 在线欧美不卡| 亚洲专区区免费| 在线观看视频一区二区| 都市激情一区| 成人黄色免费网站在线观看| 999久久久国产精品| 成人高清在线观看视频| 亚洲综合久久久久| 婷婷开心激情网| 国产91免费观看| 欧美激情电影| 一级少妇精品久久久久久久| 精品国产乱码久久久久久天美| 四虎国产精品永远| 国产精品美女免费看| 仙踪林久久久久久久999| 国产老头和老头xxxx×| 精品久久中文字幕久久av| 国产主播福利在线| 91亚洲精品在线| 亚洲电影在线| 九九热免费在线| 日韩免费在线观看| 三级成人黄色影院| 日本精品免费视频| 不卡在线观看av| www.亚洲激情| 久久久久久国产精品| 久久99国产精品视频| 亚洲自拍第三页| 亚洲a一区二区| 91短视频版在线观看www免费| 亚洲伊人第一页| 久久婷婷久久| 精品欧美一区二区久久久久 | 黄色性生活一级片| 欧美日韩大陆在线| sm在线观看| 亚洲欧美日韩另类精品一区二区三区| 国产精品99久久不卡二区| 亚洲欧美综合自拍| 久热精品在线视频| 欧美猛男男男激情videos| 潘金莲一级淫片aaaaa| 91国内精品野花午夜精品|