Node.js實現(xiàn)前端上傳單文件&文件夾到 Linux

最近有一個需求议街,就是需要制作一個頁面能將文件上傳到Linux里。

簡單分析

我這邊Linux是 win10的Linux子系統(tǒng)
后臺搭的是node后臺
前端是用的簡單的jq頁面忙灼,比較粗糙味咳,實現(xiàn)功能為主

當拿到這個需求的時候肮柜,我們拆分這個需求棍弄,發(fā)現(xiàn)我應(yīng)該做的幾步

  1. 需要寫一個NodeJs的后臺實現(xiàn)文件上傳望薄,一個前端頁面并能跑通這個后臺,上傳到某個文件夾里
  2. 需要把這套放到Linux上并跑通

那我們就先跑通win10上的上傳demo吧呼畸!

1. 搭建 node 后臺

這里展示一下主要代碼

  • 這里用到的 multer 需要npm install multer 下載痕支,更加詳細的 multer 可以查看我最后提供的參考資料
/* --------------------上傳文件接口---------------------------- */
const multer = require('multer');

//設(shè)置跨域訪問
app.all('*', function(req, res, next) {
    //設(shè)置允許跨域的域名,*代表允許任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //res.header("Access-Control-Allow-Credentials", "true");  
    //允許的header類型
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    //跨域允許的請求方式
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1');
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

let uploadFilePath = ''
const headerConfig = multer.diskStorage({
    // destination 上傳目的地文件夾 (必需)
    destination: (req, file, callback) => {
        // uploadFilePath 為目錄絕對路徑(用戶選擇目錄的絕對路徑)
        callback(null, uploadFilePath)
    },
    // 拿到所上傳文件的 filename處理蛮原,我是處理成原來的名稱(可以打印出 file 的各個屬性看看)
    filename: (req, file, callback) => {
        callback(null, file.originalname);
    }
})
const upload = multer({
    storage: headerConfig
})
// 上傳 單個文件接口
app.post('/uploads', upload.single('file'), (req, res) => {
    res.send({"code": 1,});

})
// 上傳 文件夾接口
app.post('/uploadFolder', upload.array('file', null), (req, res) => {
    res.send({"code": 1,});
})

2. Postman 測試接口

  • 也可以直接寫前端頁面調(diào)用這個后臺接口卧须。但是我想先用 Postman 先測通這個 node 接口∪逶桑可以跑通的時候花嘶,表示我的后臺接口沒有出問題。再去實現(xiàn)前端頁面蹦漠,如果有什么問題就可以基本上鎖定是前端頁面的問題椭员。
  • 一般測后臺接口的任務(wù),后端會測好提供的接口都是沒有問題的津辩,但是我們一個人寫的話可能就會忽略這一步拆撼。

3. 前端頁面實現(xiàn)

  • 下面是 html 的主要代碼
    <!-- 這是單文件上傳與文件夾上傳的兩個按鈕 -->
    <div style="margin-bottom: 10px;">
        單文件上傳:<input type="file" id='file' name="file" />
        <input type="button" value="單文件上傳" onclick="uploadPic()" /> 
    </div>
    <div>
        文件夾上傳:<input type="file" id='fileFolder' name="file"  webkitdirectory/>
        <input type="button" value="文件夾上傳" onclick="uploadPic(1)" />
    </div>
  • 下面是 js 代碼
    const uploadPic = (type) => {
        let formData = new FormData();
        let key = $('#file')[0].files
        let url = 'http://127.0.0.1:3000/uploads'
        if (type === 1) {
            // 上傳文件夾
            url = 'http://127.0.0.1:3000/uploadFolder'
            key = $('#fileFolder')[0].files
        }
        // 當文件夾上傳時容劳,就把文件夾的文件依次添加進 formData
        for (var i = 0; i < key.length; i++) {
            formData.append('file', key[i]);
        }
        // 簡單寫個ajax 調(diào)用 
        $.ajax({
            url: url,
            data: formData,
            type: 'post',
            // 告訴jQuery不要去設(shè)置Content-Type請求頭
            contentType: false,
            // 告訴jQuery不要去處理發(fā)送的數(shù)據(jù)
            processData: false,
            crossDomain: true,
            cache: false,
            success: function(res) {
                alert('上傳成功');
            },
        })
    }

階段性成功

到這里喘沿,用node upload.js 開啟后臺,打開剛寫的html頁面竭贩,依次測試上傳文件蚜印。與上傳文件夾都成功了,我們的第一大步也就實現(xiàn)了留量。接下來只用把這個項目遷移進 Linux 就大功告成啦窄赋!

4.Linux 上相關(guān)環(huán)境搭建

這一步我之前寫過哟冬。Win10的Linux子系統(tǒng)中安裝node環(huán)境與Linux中npm失敗問題

5. 遷移上傳 demo 項目

  • 我們的 node 后臺 upload.js 修改一下上傳目的地 destination 就可以直接放到 linux 里了
  • 因為是 win10的linux子系統(tǒng)關(guān)系,win10上打開頁面忆绰,也是可以直接訪問到 Linux里的后臺浩峡,那我們前端頁面里 ajax的請求url 自然也需要更新。
  • 我在Linux里 搭建了nginx這個靜態(tài)web服務(wù)器错敢,我 demo 中前端頁面是直接修改 nginx 的首頁翰灾,后臺頁面放到了 nginx首頁的路徑下。安裝好依賴啟動nginx就可以看到上傳頁面了稚茅,非常方便纸淮。

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亚享,隨后出現(xiàn)的幾起案子咽块,更是在濱河造成了極大的恐慌,老刑警劉巖欺税,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侈沪,死亡現(xiàn)場離奇詭異,居然都是意外死亡晚凿,警方通過查閱死者的電腦和手機峭竣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晃虫,“玉大人皆撩,你說我怎么就攤上這事≌芤” “怎么了扛吞?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荆责。 經(jīng)常有香客問我滥比,道長,這世上最難降的妖魔是什么做院? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任盲泛,我火速辦了婚禮,結(jié)果婚禮上键耕,老公的妹妹穿的比我還像新娘寺滚。我一直安慰自己,他們只是感情好屈雄,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布村视。 她就那樣靜靜地躺著,像睡著了一般酒奶。 火紅的嫁衣襯著肌膚如雪蚁孔。 梳的紋絲不亂的頭發(fā)上奶赔,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音杠氢,去河邊找鬼站刑。 笑死,一個胖子當著我的面吹牛鼻百,可吹牛的內(nèi)容都是我干的笛钝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愕宋,長吁一口氣:“原來是場噩夢啊……” “哼玻靡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起中贝,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤囤捻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邻寿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝎土,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年绣否,在試婚紗的時候發(fā)現(xiàn)自己被綠了誊涯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒜撮,死狀恐怖暴构,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情段磨,我是刑警寧澤取逾,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站苹支,受9級特大地震影響砾隅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜债蜜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一晴埂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寻定,春花似錦儒洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唐含,卻和暖如春浅浮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捷枯。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工滚秩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淮捆。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓郁油,卻偏偏與公主長得像,于是被迫代替她去往敵國和親攀痊。 傳聞我的和親對象是個殘疾皇子桐腌,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容