日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

怎么處理文件上傳?下面本篇文章給大家介紹一下node項目中如何使用express來處理文件的上傳,希望對大家有所幫助!


node項目中如何使用express來處理文件的上傳


上傳單個文件

我們可以使用 express 官方出品的第三方中間件 multer 來處理,先是安裝:

npm i multer

然后我先放段比較完整的代碼,之后解釋:

const express = require('express')
const multer = require('multer')
const app = express()
 
const upload = multer({ dest: './uploads' })
 
app.post('/upload', upload.single('file'), (req, res) => {
  console.log(req.file)
  res.end('上傳成功')
})
 
app.listen(4396, () => {
  console.log('服務器開啟')
})

引入后的 multer 為一個函數,執行它得到 upload 對象,執行時可以傳入配置,比如設置 dest (destination 的縮寫) 為 './uploads',用于指定上傳后的文件的存放位置: 

const upload = multer({ dest: './uploads' })

由于對上傳文件的處理并不是普遍需要的,所以對 upload 的使用是直接在匹配上傳路徑(我們定義為 '/upload')和方法(一般為 POST)的 app.post('/upload', ) 內,處理的是單個文件上傳,所以使用 upload.single() 方法,傳入的 'file'(自定義,也可以為其它名字) 為上傳文件時的 key:


node項目中如何使用express來處理文件的上傳


其執行會返回一個中間件函數,將得到的文件的數據賦值到 req.file,而文本字段的信息則會放在 req.body 中,并調用 next(),這樣我們就可以接著注冊一個中間件,打印查看文件信息,并向客戶端返回請求結果 :

app.post('/upload', upload.single('file'), (req, res) => {
  console.log(req.body)
  console.log(req.file)
  res.end('上傳成功')
})

發起上傳請求后,打印得到的 req.body 如下:

[Object: null prototype] { name: 'jay' }

注意,如果請求的 body 使用 form-data 格式攜帶的數據里沒有文件,而僅僅是一些文本字段,則 upload.single('file') 可以換成 upload.any()

打印得到的 req.file 如下:

{
  fieldname: 'file',
  originalname: '1.png',
  encoding: '7bit',
  mimetype: 'image/png',
  destination: './uploads',
  filename: '4c5781db70269d90cc57249e95a28894',
  path: 'uploads\\4c5781db70269d90cc57249e95a28894',
  size: 904454
}

并且文件會存儲在 uploads 目錄下:


node項目中如何使用express來處理文件的上傳


可以看到,文件名為哈希值,且沒有后綴,在 vscode 里無法直接查看圖片:


node項目中如何使用express來處理文件的上傳


但圖片文件是可用的,使用 ps 是可以直接打開查看的。那如果想讓文件存儲時的文件名是添加后綴的,要怎么辦呢?解決方案是在執行 const upload = multer() 時,傳入的配置對象不再設置 dest 的值而改為設置 storage

const storage = multer.diskStorage({
  destination(req, file, cb) {
    cb(null, './uploads')
  },
  filename(req, file, cb) {
    cb(null, Date.now() + '-' + file.originalname)
  }
})
const upload = multer({ storage })

storage 對象由 multer.diskStorage() 生成,其內部傳入對象,該對象有兩個方法屬性,它們都有 3 個參數,請求對象 req,文件信息 file,和一個回調函數 cb

destination 就是配置文件存儲路徑的,其作用等同于之前直接往 multer() 傳入的 { dest: './uploads' },存儲路徑通過 cb 的第二個參數傳入,cb 的第一個參數可以傳 Error 對象或直接傳 null

filename 就可以用來自定義文件名,因為 file.originalname 也就是上傳的文件的原來的文件名,其是帶有后綴的,所以我們在它前面加個時間戳來作為存儲時的文件名。

現在再次發送上傳文件請求,存儲到 uploads 目錄下的文件就有帶后綴名了,可以直接在 vscode 打開查看:


node項目中如何使用express來處理文件的上傳


上傳多個文件

如果請求一次性上傳多個文件,則只需要將 upload.single('file') 替換為 upload.array('files', 3) 即可,傳入參數意為上傳時文件的 key 為 files(自定義的,也可以是其它名字),并且限制最多上傳 3 張圖片,得到的文件信息可以在下一個中間件函數的 req.files 獲取:

app.post('/upload', upload.array('files', 3), (req, res) => {
  console.log(req.files)
  res.end('上傳成功')
})

當我們一次上傳多個文件時:


node項目中如何使用express來處理文件的上傳


打印 req.files 得到的就是個數組了:

[
  {
    fieldname: 'files',
    originalname: '1.png',
    encoding: '7bit',
    mimetype: 'image/png',
    destination: './uploads',
    filename: '1676958850980-1.png',
    path: 'uploads\\1676958850980-1.png',
    size: 904454
  },
  {
    fieldname: 'files',
    originalname: 'qrcode.png',
    encoding: '7bit',
    mimetype: 'image/png',
    destination: './uploads',
    filename: '1676958850986-qrcode.png',
    path: 'uploads\\1676958850986-qrcode.png',
    size: 1076
  }
]


將文件部署為靜態資源

可以使用內置的 express.static('./uploads') 中間件函數將存儲上傳文件的 uploads 目錄設置為靜態資源。然后傳給 app.use()

app.use(express.static('./uploads'))

這樣我們就可以直接通過瀏覽器查看上傳得到的文件了,比如 uploads 有張圖片如下:


node項目中如何使用express來處理文件的上傳


只需要在瀏覽器輸入 localhost:4396/1677031777791-1.png 即可查看。

分享到:
標簽:node項目 express文件上傳
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定