十天上手Node+KOA(3)

發布任務~
一、path模塊
二、url模塊
三、formidable包

一、path模塊

path 模塊提供用于處理文件路徑和目錄路徑的實用工具

const paths = require('path');
let dir = 'D:/node/';
// 將碎片化路徑拼接在一起,規范化生成的路徑
path.join(dir, './public'); // D:\node\public

let extStr = '/index.html';
// path的擴展名
path.extname(extStr); // .html

二、url模塊

用于處理與解析 URL
實例化URL
new URL(input)
input: 要解析的輸入URL

let url = '/';
let appUrl = new URL('http://localhost:3002' + decodeURIComponent(req.url));

//  URL {
//     href: 'http://localhost:3002/',
//     origin: 'http://localhost:3002',
//     protocol: 'http:',
//     username: '',
//     password: '',
//     host: 'localhost:3002',
//     hostname: 'localhost',
//     port: '3002',
//     pathname: '/',
//     search: '',
//     searchParams: URLSearchParams {},  
//          獲取表示URL查詢參數的URLSearchParams對象
//          通過get(key) 可獲取value
//     hash: '' 
//   }

實戰: 使用formidable實現上傳圖片

客戶端:

<body>
   <input type="file" id="file">
   <div id="img-containers"></div>
</body>
    let file = document.getElementById('file');
   let imgContainer = document.getElementById('img-containers');
   
   file.addEventListener('change', uploadFile);

   function uploadFile() {
       // 實例化formData
       let form = new FormData();
       // 實例化讀取文件
       let fileReader = new FileReader();

       fileReader.onload = function () {
           let img = document.createElement('img');

           img.src = fileReader.result;

           // 顯示圖片
           img.onload = function () {
               imgContainer.appendChild(img);
           }
       }

       fileReader.readAsDataURL(this.files[0]);
       // 存入單張圖片至formData中
       form.set('file', this.files[0]);
       // 可存入多張 (Array)
       // form.append('file', this.files[0]);

       filePost('/upload', form, (data) => {
           console.log(data);
       })
   }

   // post 傳輸文件(formData格式)
   function filePost(url, form, callback) {
       let xhr = new XMLHttpRequest();

       xhr.open('POST', url);
       xhr.onreadystatechange = function () {
           if (xhr.readyState === 4 && xhr.status === 200) {
               callback(xhr.responseText);
           }
       }
       xhr.send(form);
   }

服務端
引入基本依賴

const http = require('http');

const fs = require('fs');

const paths = require('path');
let dir = 'D:/node/'
console.log(paths.join(dir, './public'));

const { URL } = require('url');

// 上傳文件的第三方包
const formidable = require('formidable');

// 以流的方式讀取文件,當訪問/作為首頁返回
const readStreamIndex = fs.createReadStream('./public/html/index.html');

搭建服務及創建路由接口


http.createServer((req, res) => {

    // 將url轉為url對象
    let appUrl = new URL('http://localhost:3002' + decodeURIComponent(req.url));

    // 返回首頁
    if (req.method === 'GET' && appUrl.pathname === '/') {
        readStreamIndex.pipe(res);
    }

    if (req.method === 'POST' && appUrl.pathname === '/upload') {
        // 創建一個新的的正在進入的表單
        var form = new formidable.IncomingForm();
        // 指定文件保存路徑
        form.uploadDir = './public/uploads';
        // 解析文件
        form.parse(req, function (err, fields, files) {

            if (err) res.end(JSON.stringify(err));

            // 修改文件名
            var oldPath = paths.join(__dirname, files['file'].path);
            // 以時間戳命名 以免 文件重名
            var comment = new Date() * 1 + '';

            var newPath = paths.join(__dirname, './public/uploads', comment + files['file'].name);
            // 保存在用戶信息里面
            fields.imgSrc = newPath;
            // 文件重命名
            fs.rename(oldPath, newPath, function (err) {
                res.writeHead(200, { 'Content-type': 'text/plain; charset=UTF-8' });
                var result = err ? '上傳失敗' : '上傳成功';
                if (err) res.end(result);

                // 存儲圖片信息
                fs.writeFile(__dirname + '/imgInfor/' + comment + '.json', JSON.stringify(fields), function (err) {
                    res.writeHead(200, { 'Content-type': 'text/plain; charset=UTF-8' });
                    var result = err ? '上傳失敗' : '上傳成功';
                    res.end(result);
                });
            });
        });
    }
}).listen(3002, (err) => {
    if (err) throw err;
    console.log('listen 3002');
});

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容