nodejs實(shí)現(xiàn)文件傳輸保存

今天利用node做一個(gè)文件上傳功能,
使用場(chǎng)景:這個(gè)在我們很多的應(yīng)用當(dāng)中都會(huì)遇到,比如我們注冊(cè)用戶,注冊(cè)用戶的時(shí)候都會(huì)要求上傳頭像;比如說(shuō)大家做訂單系統(tǒng),商品有問(wèn)題、故障,訂單肯定會(huì)有退換貨功能吧,要求上傳圖片等等。
但是具體怎么操作,咋們一步一步來(lái)
1.0 安裝express模塊

$ npm install express

1.1 這里我們用到formidable模塊
(在npm包管理器中,介紹這是一個(gè)Node.js模塊,用于解析表單數(shù)據(jù),特別是文件上傳。)

formidable.png

$ npm install formidable

1.2 創(chuàng)建文件一個(gè)file文件
(創(chuàng)建文件這個(gè)就不細(xì)說(shuō)了,看圖就可以)

文件.png

這里主要?jiǎng)?chuàng)建了兩個(gè)文件夾public我用來(lái)放中間件和uploads用來(lái)存放圖片,以及一個(gè)app.js文件。
1.3 在public下寫(xiě)一個(gè)fileuploads.html文件
(寫(xiě)個(gè)表單,然后用ajax上傳)↓

<body>
    <!-- 添加表單元素 -->
    <h2>With <code>"express"</code> npm package</h2>
    <form class="form">
        <div>標(biāo)題: <input type="text" name="title" /></div>
        <div>File: <input type="file" name="someExpressFiles" multiple="multiple" /></div>
        <input type="submit" value="Upload" />
    </form>
    <script>
        // 封裝$ 使用自調(diào)用函數(shù),封裝$
        ($ = s => document.querySelector(s))()
        //使用ajax發(fā)送數(shù)據(jù)
        $('.form').addEventListener('submit', function (eve) {
            eve.preventDefault()    //阻止表單提交默認(rèn)行為
            let fromData = new FormData(eve.target)
            
            let xhr = new XMLHttpRequest
            xhr.open('post', 'http://localhost:8527/public/files/student')   //請(qǐng)求的地址
            xhr.send(fromData)      //發(fā)送請(qǐng)求攜帶formData
            // 處理響應(yīng)
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        const data = JSON.parse(xhr.responseText) 
                        console.log('成功:', data)
                    } else {
                        console.error('失敗')
                    }
                }
            }
        })
    </script>
</body>

這里用了一個(gè)普通表單,給submit提交綁定了一個(gè)事件監(jiān)聽(tīng),因?yàn)辄c(diǎn)擊會(huì)全頁(yè)面刷新,(上傳文件不需要跳轉(zhuǎn)頁(yè)面,我這里是服務(wù)端返回一個(gè)json數(shù)據(jù)),利用formDate構(gòu)建ajax提交的數(shù)據(jù)。剩下就是一個(gè)ajax發(fā)送post請(qǐng)求,成功就返回data數(shù)據(jù)
formDate
1.4 app.js

//引入模塊
const express = require('express')
const cors = require('cors')
const userFile = require('./public/files')    // ! files 模塊
//調(diào)用模塊,創(chuàng)建應(yīng)用
const app = express()
app.use(cors()) //跨域問(wèn)題
app.use(express.static('public'))   // ! 托管靜態(tài)資源
app.use('/public/files',userFile)  //靜態(tài)路由,用use把router添加到中間件處理路徑,我們就可以在主應(yīng)用中,使用這個(gè)模塊中的路由模塊
// ! 設(shè)置監(jiān)聽(tīng) 8527 端口,到時(shí)候我們?cè)跒g覽器就訪問(wèn)這個(gè)端口
app.listen(8527,()=>console.log("server running succeed"))

先引入我們要用到的模塊
用static中間件來(lái)托管靜態(tài)文件,包括圖片、CSS 以及 JavaScript 文件(其實(shí) static() 是 Express 提供的原生中間件函數(shù)之一)
因?yàn)樯婕暗娇缬?CORS)(或通俗地譯為跨域資源共享)是一種基于 HTTP 頭的機(jī)制,該機(jī)制通過(guò)允許服務(wù)器標(biāo)示除了它自己以外的其它origin(域,協(xié)議和端口),這樣瀏覽器可以訪問(wèn)加載這些資源。
一個(gè)nodejs模塊

安裝 npm install cors
用法: const cors = require('cors')
app.use(cors())

1.5 在public下創(chuàng)建files.js文件

//引入router方法,實(shí)現(xiàn)路由模塊化
const formidable = require('formidable')
const path = require('path')
const fliesRouter = require('express').Router()

fliesRouter.post('/student',(request,response,next) => {
    const form = formidable({
        uploadDir: path.join(__dirname, '../uploads'), // 上傳文件放置的目錄
        keepExtensions: true,           //包含源文件的擴(kuò)展名
        multiples: true                 //多個(gè)文件的倍數(shù)
      })
    
      // 從請(qǐng)求中解析提交的數(shù)據(jù)(包括文本與文件數(shù)據(jù))
      // fields 中保存的是文本數(shù)據(jù)信息
      // files 中保存的是文件數(shù)據(jù)相關(guān)信息
      form.parse(request, (err, fields, files) => {
        if (err) {  
          next(err)
          return
        }
        response.json({      //響應(yīng)json數(shù)據(jù)
          code: 200,
          data: { fields, files }
        })
      })
    })
//導(dǎo)出
module.exports = fliesRouter

介紹:
首先 require() 路由模塊(files.js),然后在 Express 應(yīng)用中調(diào)用 use() 把 Router 添加到中間件處理路徑中,就可以在主應(yīng)用中使用這個(gè)模塊中的路由處理器了。
這個(gè)模塊主要是對(duì)post請(qǐng)求的處理,
uploadDir:用于放置上傳文件的目錄。以后可以使用fs.rename()來(lái)移動(dòng)它們。
keepExtensions: {boolean}默認(rèn)false ,是否包含原始文件的擴(kuò)展名
multiples:當(dāng)你調(diào)用.parse方法時(shí),files參數(shù)(回調(diào)函數(shù)的)將包含使用HTML5 multiple屬性提交多個(gè)文件的輸入文件數(shù)組。fields參數(shù)將包含名稱以'[]'結(jié)尾的字段的值數(shù)組。
formidable npmjs有介紹
express.Router mdn也有介紹

然后我們?cè)赾md 中啟動(dòng)node 監(jiān)聽(tīng)

開(kāi)啟.png
最后在瀏覽器中打開(kāi)
node文件上傳.gif

上傳文件到服務(wù)器到這里就完成了,哈哈哈這個(gè)圖有點(diǎn)大,將就看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容