用Node.js读取远程的图片文件并写入本地?

如题,我想从通过远程绝对路径获取一些图片,并写入本地的某个文件夹内。如下处理:

const http = require('http')
const fs = require('fs')

const urlArr = [
'http://img.zcool.cn/community/01e505554437be0000019ae95582a2.jpg@900w_1l_2o_100sh.jpg',
'http://static.pig66.com/uploadfile/2017/1102/20171102095531217.png',
]

urlArr.forEach(url => {
    getImg(url)
})

function getImg(url, name) {
    http.get(url, {encoding: null}, res => {
        let img = []
        let size = 0
        // 将图片地址以【.】符号分割,取最后一项,即为格式后缀
        const _arr = url.split('.')
        const format = _arr[_arr.length - 1]
        // 如果没有传入图片名字,则使用随机数
        const _name = name ? name : 'image-' + Math.floor(Number(new Date()) * Number(Math.random()))
        res.on('data', chunk => {
            img.push(chunk)
            size += chunk.length
        })
        res.on('end', () => {
            // 合并 Buffer
            const buffer = Buffer.concat(img, size)
            fs.writeFileSync(`img/${_name}.${format}`, buffer, (err) => {
                if (err) {
                    return console.error(err);
                }
                console.log("数据写入成功!");
            })
        })
    })
}

总共写了两张图片,执行没有报错,一张图片正常,但另一张图片打不开。

clipboard.png

怀疑是格式问题,但应该在哪个环节做格式处理和怎么做格式处理呢?

谢谢!

阅读 7.3k
2 个回答

你可以 console.log(String(buffer)) 打印一下,第二个url请求到的数据是什么.这个链接问题 301 重定向了的

简单的针对这个url 301重定向处理:

//......
http.get(url, {encoding: null}, res => {
    const { statusCode } = res
    if ( statusCode === 301 ) {
        const url = res.headers['location']
        return getImg(url)
    }
//......
推荐问题
宣传栏