删除文章

确定要删除这篇文章吗?

取消
确定

nodejs下载图片保存到本地

     阅读(25943)  2017-08-17 08:02:50

我们经常在使用别人图片url的时候发现图片显示不了,很可能对方做防盗链处理。在浏览器端有这个限制但是在后端就没有这个问题了。所以我们可以通过图片的url在服务端将这个图片下载下来保存在服务器上,然后客户端去访问我们自己的服务器,为了保证最小的改动,最好是保持原来url的图片路径,我们只需要换url前面的域名就可以了。

分析源url,创建本地目录以及解析出新的写入路径

使用mkdirSync函数同步的进行循环递归创建目录

function mkdirSync(dirname) {
    if (fs.existsSync(dirname)) {
        return true;
    } else {
        if (mkdirSync(path.dirname(dirname))) {   
            fs.mkdirSync(dirname);
            return true;
        }
    }
    return false
}

如:http://api.3inns.cn/mito/uploadImages/2015/355/17/8032VO7EM87O_113.jpg,的图片路径应该是: 当前目录/mito/uploadImages/2015/355/17/8032VO7EM87O_113.jpg

下载并写入

request(url).pipe(fs.createWriteStream(dstpath))

完整代码如下:

var request = require('request')
var fs = require('fs')
var path = require('path')

const dirname = 'uploadImages'
const hostdir = "./public/mito/"
function mkdirSync(dirname) {
    if (fs.existsSync(dirname)) {
        return true;
    } else {
        if (mkdirSync(path.dirname(dirname))) {   
            fs.mkdirSync(dirname);
            return true;
        }
    }
    return false
}

function downloadUrl(urlList) {
    for (const url of urlList) {
      const first = url.indexOf(dirname)
      const last = url.lastIndexOf('/')
      if (first > 0 && last > 0) {
        const name = url.substr(last + 1)
        const dir = url.substr(first, last - first)
        const dstpath = hostdir + dir + '/' + name
        if (name.length && dir.length && !fs.existsSync(dstpath)) {
          if (mkdirSync(hostdir + dir)) {
            console.log(dstpath)
            request(url).pipe(fs.createWriteStream(dstpath))
          }
        }
      }
    }
}

删除大于100k的文件

var exec = require('child_process').exec;
var fs = require('fs')
var path = require('path')
var util = require('util')

const hostdir = path.join(__dirname, 'uploadImages')
const readAllFilePathSync = (function() {
    const resultList = []
    return {
        execute: function execute(dir) {
            if (fs.existsSync(dir)) {
                const stats = fs.statSync(dir)
                if (stats.isFile()) {
                    resultList.push(dir);
                } else if (stats.isDirectory()) {
                    const subdir = fs.readdirSync(dir)
                    if (subdir.length) {
                        subdir.forEach(function(sub) {
                            execute(path.join(dir, sub))
                        })
                    }
                }
            }
        },
        result: function() {
            return resultList;
        }
    }
}())

readAllFilePathSync.execute(hostdir);
readAllFilePathSync.result().forEach(function(path) {
    //path = path.replace(/\\/g, '\\\\'); // windows路径
    const stats = fs.statSync(path)
    if (stats.size > 100 * 1024) {
        exec('rm -f ' + path)
        console.log(path)
    }
})

文章评论

Keep it simple,stupid
文章数
305
总访问量
532208
今日访问
78
最近评论

tujiaw : registerThreadInactive:如果当前没有激活的线程,就去激活线程,让等待的线程去执行任务。
hgzzx : 佩服佩服。 请教:registerThreadInactive的作用是什么?
xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
回到顶部