当其 URL 不包含文件扩展名时,如何使用 Nodejs 下载图像?

布罗德

我正在 Nodejs 中构建一些网络爬虫。刮板可以做的一件事是下载图像。一切都很好,直到我尝试抓取一个网站,该网站的图像不包含 url 中的文件扩展名,例如:https : //example.com/images/someimagewithoutextension

这是我正在使用的小型库中的一些代码,用于下载和保存图像:

 options.encoding = null

request(options, (err, res, body) => {
if (err) {
  return onError(err, done)
}

if (body && (res.statusCode === 200 || res.statusCode === 201)) {
  if (!path.extname(options.dest)) {
    options.dest = path.join(options.dest, path.basename(options.url))
  }

  fs.writeFile(options.dest, body, 'binary', (err) => {
    if (err) {
      return onError(err, done)
    }

    if (typeof done === 'function') {
      done(false, options.dest, body)
    }
  })
} 

因此,当图像 URL 缺少扩展名时,我会收到如下错误:

错误:ENOENT:没有这样的文件或目录,打开“C:\Users\someuser\Desktop\nodescraper\images\somefilenamewithoutextension”

当我 console.log() 响应的“主体”时,我得到一些 Buffer 数组(因此我无法检查 mime 类型或类似的东西),据我所知,这表示一个流。当我从请求配置中删除 encoding:null 时,我得到一组字符,但节点实际上崩溃了。

我怎么能保存这样的图像?

桑特·马鲁蒂

恩诺恩

来自node.js 文档

ENOENT(没有这样的文件或目录):通常由 fs 操作引发,以指示指定路径名的组件不存在 - 给定路径找不到任何实体(文件或目录)。

此外,如果文件名包含任何受限制的字符,例如? ,因此建议删除或替换这些字符以确保您的应用程序运行时没有任何错误。检查npm 上的sanitize-filename包。

检测扩展

HTTP Content-Type响应头包含响应正文的mime-type因此,您可以使用它来检测您正在下载的文件扩展名。例如,如果您获得image/jpeg内容类型,则文件扩展名可以是.jpegnpm 上还有一堆可以将 mime 类型转换为文件扩展名。

完整示例

const { writeFile } = require('fs');
const { extension } = require('mime-types');
const { basename, extname, join } = require('path');
const request = require('request');
const sanitize = require('sanitize-filename');

const dest = join(__dirname, 'images');
const url = '<URL>';

request({ url, encoding: null }, (error, response, body) => {
    if (error || response.statusCode < 200 || response.statusCode >= 300) {
        console.error('Request failed!');
        return;
    }

    let fileName = join(dest, sanitize(basename(url)));
    if (!extname(fileName)) {
        const contentType = response.headers['content-type'];
        const ext = extension(contentType);

        if (ext) {
            fileName += `.${ext}`;
        } else {
            console.error('Cannot detect file extension!');
        }
    }

    writeFile(fileName, body, (err) => {
        if (err) {
            console.error(err);
            return;
        }

        console.log('done');
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们如何下载图像,当其 URL 不包含文件扩展名并上传带有文件扩展名的图像

来自分类Dev

使用NodeJS从URL下载JPG时图像损坏

来自分类Dev

使用curl从没有文件扩展名的URL下载图像

来自分类Dev

iOS如何从URL下载图像

来自分类Dev

如何从多个URL下载图像?

来自分类Dev

如何使用nodejs提取URL的扩展名?

来自分类Dev

使用cURL php从URL下载带有扩展名的图像

来自分类Dev

如何使用wget下载包括其图像的整个网站

来自分类Dev

如何在JavaScript(Nodejs)中下载URL?

来自分类Dev

Elixir-从URL下载文件(图像)

来自分类Dev

如何从R中的URL下载并显示图像?

来自分类Dev

如何正确设置Volley以从URL下载图像

来自分类Dev

在Flutter中-如何传递从url下载的图像

来自分类Dev

如何从MVC中的URL下载图像

来自分类Dev

使用ImageLoader从AWS url android下载图像

来自分类Dev

使用Perl通过URL下载图像

来自分类Dev

使用C#从URL下载.webp图像

来自分类Dev

使用 urllib 从 JSON url 下载图像

来自分类Dev

使用ImageLoad(Android)下载图像后下载URL

来自分类Dev

如何使用其 GUID 获取图像字节或 URL?

来自分类Dev

无法使用nodejs从文本文件下载图像

来自分类Dev

nodejs用superangent下载图像,检查文件大小

来自分类Dev

修改抓取的 url 并更改其扩展名

来自分类Dev

当以角度 4 按下按钮时如何从 url 下载图像

来自分类Dev

从URL Python下载图像

来自分类Dev

从URL Flutter下载图像

来自分类Dev

从URL同步下载图像

来自分类Dev

Android从URL下载图像

来自分类Dev

如何使用Carrierwave下载和存储远程图像URL