如何使用仅具有 URL 的 Sharp 在 NodeJS 中调整图像大小,使用 async/await,而不创建本地副本?

2023-12-24

我工作的环境中可用的图像处理库是 NodeJSSharp https://github.com/lovell/sharp用于缩放图像。它一直很稳定,因为它是基于管道的,但我的任务是将其转换为 TypeScript,并在可能的情况下使用 Async/Await 进行设置。我已准备好大部分内容,但我面临的问题在于,我所拥有的只是图像的 URL,而 Sharp 需要字符串 URI(仅限本地文件)或缓冲区。

目前,我正在使用该包Axios https://github.com/axios/axios为了将图像作为可检索的字符串来获取data响应上的属性。我一直在提供从字符串创建的缓冲区Buffer.from(response.data)进入夏普,它没有任何问题,直到我尝试通过尝试收集元数据来“处理”图像。此时会抛出错误:[Error: Input buffer contains unsupported image format]。但我知道该映像是有效的,因为它在旧系统中工作,并且我没有更改任何依赖项。

我使用 QuokkaJS 进行测试,以下 PoC 失败,我需要让它恢复正常运行。

import axios from 'axios';
import Sharp from 'sharp';
const url = 'https://dqktdb1dhykn6.cloudfront.net/357882-TLRKytH3h.jpg';

const imageResponse = await axios({url: url, responseType: 'stream'});
const buffer = Buffer.from(imageResponse.data);
let src = new Sharp(buffer);
const src2 = src.clone();//this is simply because it will end up being a loop, if this is the issue let me know.
try {
    await src2.jpeg();
    await src2.resize(null, 1920);
    await src2.resize(1080, null);
    const metadata = await src2.clone().metadata();//this is where it fails
    console.log(metadata);
} catch(e) {
    console.log(e);//logs the mentioned error
}

如果有人知道我做错了什么,或者有任何他们希望我添加的具体信息,请告诉我!如果我need要通过管道传输图像数据,请告诉我。我尝试过直接通过管道获取pipe is not a function在字符串上(这是有道理的)。

更新#1:

非常感谢@Thee_Sritabtim 的评论,它解决了这个问题。基本上,我一直在尝试将基于流的字符串转换为缓冲区。我需要声明该请求是为了ArrayBuffer,然后将其输入 Sharp,同时声明其类型binary。 PoC 的工作示例如下!

import axios from 'axios';
import Sharp from 'sharp';
const url = 'https://dqktdb1dhykn6.cloudfront.net/357882-TLRKytH3h.jpg';

const imageResponse = await axios({url: url, responseType: 'arraybuffer'});
const buffer = Buffer.from(imageResponse.data, 'binary');
let src = new Sharp(buffer);
try {
    await src.jpeg();
    await src.resize(null, 1920);
    await src.resize(1080, null);
    const metadata = await src.metadata();//this was where it failed, but now it prints an object of metadata
    console.log(metadata);
} catch(e) {
    console.log(e);//Doesn't catch anything any more!
}

从 a 获取缓冲区axios响应,你必须设置responseType to 'arraybuffer'.

const imageResponse = await axios({url: url, responseType: 'arraybuffer'})
const buffer = Buffer.from(imageResponse.data, 'binary')

或者,

您还可以使用流作为输入sharp(),这样你就可以保留responseType to 'stream'

const imageResponse = await axios({url: url, responseType: 'stream'})

const src = imageResponse.data.pipe(sharp())
//...
const metadata = await src.metadata()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用仅具有 URL 的 Sharp 在 NodeJS 中调整图像大小,使用 async/await,而不创建本地副本? 的相关文章

随机推荐

  • .NET 世界中的 ORM 和 SOA [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 根据我的经验 NET 的主要 ORM 框架 NHibernate http nhforge org Linq 转 Sql http msdn m
  • 为什么 Android 会截断我的 ActionBar 标题?

    在我的应用程序中 我更改了 ActionBar 中显示的每个片段的标题 当我第一次启动我的应用程序时 我收到了一个请求列表 因此我的标题是 我的请求 20 然后 当您单击该列表中的某个项目时 它会替换我的活动中的一个片段 并将标题设置为 操
  • 如何在子例程内引用哈希?

    我正在尝试使用模块的 tie 功能配置 Ini文件 http search cpan org shlomif Config IniFiles 2 65 lib Config IniFiles pm但我不知道如何引用子例程内部的哈希 如果我从
  • 查询或过滤最小字段值?

    示例 存储在索引中的文档表示测试分数和有关每个测试的元数据 test 1 user 1 score 100 meta other data test 2 user 2 score 65 meta other data test 3 user
  • Pylint 未在 VScode 中按预期运行

    当我通过 shell 运行时pylint pylint decorator py No config file found using default configuration Module decorator C 7 0 Unneces
  • EC2 无法解析私有 DNS 主机名

    我是 Amazon Web Service AWS 的新手 我刚刚创建了一个 VPC 和一个位于其中的子网 但是 我无法解析该子网中的任何主机名 当我停留在该子网中的任何主机中时 ec2 user ip 192 168 1 86 nsloo
  • 根据 rowwise 函数 (dplyr) 过滤行

    您能帮我在下面的最后一个命令中使用过滤dplyr代替apply 我试图解决发布的问题here https twitter com delta dc status 585478403463245826 photo 1 library gtoo
  • 使用Spring Beans和不使用Spring Beans有什么区别?

    可能我会得到很多反对票 但是对于我来说是否使用 bean 的所有事实都让我感到困惑 让我们假设这个例子 interface ICurrency String getSymbol public class CurrencyProcessor
  • boost::filesystem::path(std::wstring) 抛出异常

    这段代码 boost filesystem is directory usr include 工作正常 这段代码 boost filesystem is directory L usr include 抛出异常 抛出一个后终止调用 std
  • 首次加载时 WPF 验证不会触发

    在 Prism 应用程序中 我想使用验证 我已经在 ViewModel 中实现了 INotifyDataError 接口 但我发现首次加载控件时不会触发验证解决方案 然后我发现了同样的问题 比如 wpf 验证绑定在首次加载时未触发 我找到了
  • 使用 ACR122 在卡模拟模式下将数据写入 Nexus 4

    我正在尝试通过 NFC 即卡模拟模式 向 Nexus 4 发送一些数据 我尝试了许多命令 APDU 例如写入和更新 APDU 但无法让它们工作 我想说的是 我想在选择 APDU 命令后向手机发送一些数据 不是 AID 提前致谢 Bader
  • Doctrine 迁移:“”命名空间中没有定义命令

    我正在尝试将 Doctrine Migrations 设置为独立程序 但遇到了一些麻烦 我在同一个文件夹中有doctrine migrations phar 和migrations yml migrations yml 包含以下内容 nam
  • 邮件:无法打开流:权限被拒绝?

    我在使用 php 发送邮件时收到此警告 警告 邮件 1 function mail 无法打开流 home 中的权限被拒绝 使用 ssmtp 和 gmail 作为 smtp PHP 5 3 1 日志中没有任何内容 没有错误 邮件到达目的地 文
  • Vue npm runserve 在随机端口上启动

    我正在尝试在端口 8080 上运行 Vue 但无法使其工作 我刚刚创建了一个全新的项目vue create 并运行它npm run serve 这会在随机端口上启动应用程序 第一次尝试 运行 npm runserve 无需任何额外配置 np
  • 确定应用程序是否正常关闭

    有没有办法判断jvm是否正常关闭 shutdown hook只能产生一个线程 有没有办法判断当时JVM是正常存在还是异常存在 您可以在启动时写入一个文件 并在正常退出时再次删除它 如果 JVM 消失了 但文件仍然存在 您就知道它崩溃了或者以
  • 对于 @TestConfiguration 类的 @SpringBootTest @Import 不执行任何操作,而 @ContextConfiguration 按预期覆盖

    考虑以下集成测试注释 RunWith SpringRunner class SpringBootTest webEnvironment SpringBootTest WebEnvironment NONE properties spring
  • SHA-256 填充

    为了计算 SHA 256 哈希值 我需要填充我的消息 我使用以下描述 取自http csrc nist gov groups STM cavp documents shs sha256 384 512 pdf http csrc nist
  • Sql 将多条记录合并为一条记录

    我有一个包含两列 user id 和标签的表 user id tags 1
  • gRPC 客户端负载均衡

    我在 kubernetes pod 中使用 gRPC 和 Python 作为客户端 服务器 我希望能够启动多个相同类型的 Pod gRPC 服务器 并让客户端 随机 连接到它们 我调度了 10 个服务器 Pod 并设置了一个 服务 来定位它
  • 如何使用仅具有 URL 的 Sharp 在 NodeJS 中调整图像大小,使用 async/await,而不创建本地副本?

    我工作的环境中可用的图像处理库是 NodeJSSharp https github com lovell sharp用于缩放图像 它一直很稳定 因为它是基于管道的 但我的任务是将其转换为 TypeScript 并在可能的情况下使用 Asyn