通常狀況下,前端的文件上傳通常都是經過form表單的(<input type="file" />)來完成文件的上傳,若是使用node中間層完成跨域,文件的上傳就須要在node中間層處理成可讀流,轉成formData完成轉發。前端
1、form表單文件上傳node
這是最多見的文件上傳方式,經過form表單實現,簡單實用,設置一下method、enctype、action屬性就能夠了,多文件上傳須要設置multiple屬性(部分瀏覽器支持仍是有些問題的)。git
1 <form method="post" enctype="multipart/form-data" action="/api/upload"> 2 <input type="text" name="username"> 3 <input type="password" name="password"> 4 <input type="file" name="file"> 5 <input type="submit"> 6 </form>
2、FormData實現文件上傳github
FormData對象用以將數據編譯成鍵值對,以便向後臺發送數據。其主要用於發送表單數據,但亦可用於發送帶鍵數據(keyed data),而獨立於表單使用。對部分瀏覽器對multiple屬性不支持的狀況,可使用formData的提交方式完成。express
1 <!-- 獲取上傳文件轉成formData類型的文件 --> 2 <input multiple id="file" name="file" type="file" /> 3 <button id="btn">提交</button>
1 const oFile = document.getElementById('file') 2 const oBtn = document.getElementById('btn') 3 4 oBtn.addEventListener('click', () => { 5 files = oFile.files 6 const formData = new FormData() 7 formData.append('file', files[0]) 8 formData.append('file1', files[1]) 9 10 fetch('/api/upload', { 11 method: "POST", 12 body: formData 13 }) 14 })
3、node中間層完成文件上傳跨域npm
跨域是由於瀏覽器的同源策略形成,跨域的方法有不少中,這裏使用的是node中間層代理完成(服務端之間的請求是不存在跨域問題)。json
node沒法直接解析上傳的文件,須要引入拓展包connect-multiparty完成,這樣就能夠拿到文件數據。api
拿到上傳文件,須要在node中轉發請求後臺server,這裏的文件不能直接發給後臺,須要將上傳的文件使用fs.createReadStream轉成可讀流,同時引入 form-data 包(node環境是沒有formData對象的),這樣就能夠實現node中間層轉發文件類型跨域
node部分代碼:瀏覽器
1 const fs = require('fs') 2 const path = require('path') 3 const FormData = require('form-data') 4 const express = require('express') 5 const fetch = require('node-fetch') 6 const router = express.Router() 7 const multipart = require('connect-multiparty'); 8 var multipartMiddleware = multipart() 9 10 router.post('/upload', multipartMiddleware, function (req, res) { 11 // console.log(req.body, req.files); 12 13 const { path: filePath, originalFilename } = req.files.file 14 const newPath = path.join(path.dirname(filePath), originalFilename) 15 16 fs.rename(filePath, newPath, function (err) { 17 if (err) { 18 return; 19 } 20 else { 21 const file = fs.createReadStream(newPath) 22 const form = new FormData() 23 form.append('file', file) 24 25 fetch('http://localhost:8080/upload', { 26 method: "POST", 27 body: form 28 }) 29 } 30 }) 31 res.json({}) 32 }); 33 34 module.exports = router;
注意:
完整的代碼請參考 node中間層實現文件上傳