天天看點

Node.js 從網頁下載下傳圖檔并替換為新位址

var data = `
<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
<div id="content">
<img src="https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png"/>
</div>
</body>
</html>

`;
const cheerio = require('cheerio');
const request = require('request');
const fs = require('fs');
const path = require('path')
const moment = require('moment')
const md5=require('md5-node');

let $ = cheerio.load(data);
$('#content img').each(function(i, ele){
    // 圖檔位址
    let src = $(this).attr('src');
    console.log(src);
    let fn = filename(src)
    download(src, "./imgs", fn);
    // 設定為新的位址
    $(this).attr('src', "/imgs/"+ fn);
    console.log($.html('#content'));
});

// md5檔案位址,防止重複下載下傳
function filename(src) {
    // 擴充名
    let type = path.extname(src);
    // 一天内的位址不重複下載下傳
    let dt = moment().format('YYYY-MM-DD');
    return md5(src + dt) + '.' + type;
}

// 遞歸建立目錄
function mkdir(dirname) {
    if (fs.existsSync(dirname)) {
        return true;
    } else {
        if (mkdir(path.dirname(dirname))) {
            fs.mkdirSync(dirname);
            return true;
        }
    }
    return false;
}

// 下載下傳檔案到指定目錄
function download(uri, dir, filename) { 
    request.head(uri, function(err, res, body){
        if(mkdir(dir)) {
            request(uri).pipe(fs.createWriteStream(dir+"/"+filename));
        }
    }); 
}