javascript 在没有FileReader的NodeJS中Blob到Base64

46qrfjad  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(179)

我目前有一个类型为'image/jpeg'的blob,我需要将其转换为base64字符串。我所有的代码都是使用Nodejs在一个独立的javascript文件中,没有与任何html文件连接。我研究过的将blob转换为base64的每一种方法都涉及到使用FileReader类,这需要javascript位于html中,所以这是不可能的。我发现的唯一其他工作是使用这行代码将blob转换为缓冲区,然后转换为base64。

base64 = new Buffer( blob, 'binary').toString('base64');

但这只会返回错误:第一个参数必须是字符串、Buffer、ArrayBuffer、Array或类似数组的对象。
我被难倒了。有什么建议吗

iugsix8n

iugsix8n1#

如果你在NodeJS中使用node-fetch从URL阅读,你不想得到一个blob,而是一个buffer。然后,您可以轻松地转换为base64。

const b64 = await fetch(url)
      .then((response) => response.buffer())
      .then((buffer) => {
        const b64 = buffer.toString('base64');
        return b64;
      })
      .catch(console.error);
k75qkfdt

k75qkfdt2#

对于NodeJS(使用node-fetch),您可以使用Buffer.from(await blob.text());Buffer.from(await blob.arrayBuffer());从blob获取缓冲区。
请注意,您的环境中可能还不支持blob.arrayBuffer()
这里可以使用blob.text(),因为Buffer.from默认使用utf8。
但是,您不需要从node-fetch获取blob。
您可以直接从响应中获取缓冲区。
还有来自斑点的信息。类型可以从响应头中获得。
例如,要获取数据url,请使用blob:

async function toDataURL_node(url) {
    let response = await fetch(url);
    let blob = await response.blob();
    let buffer = Buffer.from(await blob.text());
    return "data:" + blob.type + ';base64,' + buffer.toString('base64');
}

如果不使用blob:

async function toDataURL_node(url) {
    let response = await fetch(url);
    let contentType = response.headers.get("Content-Type");
    let buffer = await response.buffer();
    return "data:" + contentType + ';base64,' + buffer.toString('base64');
}

也可以使用Buffer.from(await response.arrayBuffer())来获取缓冲区
(in toString('base64')工作时必须使用Buffer.from;如果没有它,您将得到"[object ArrayBuffer]")。

7gs2gvoe

7gs2gvoe3#

qrsngky的回答让我解决了自己的案子。转换File/Blob,该File是在sveltekit表单action中使用fetch请求formData发送的。FileReader在sveltekit服务器端不可用,所以我需要转换它nodejs方式。
在接收端,将File/Blob转换为base64的代码如下:

// +page.server.js

import { fail } from '@sveltejs/kit'

export const actions = {
  default: async ({ request, locals, cookies }) => {
    try {
      const formData = await request.formData()
      const files = Array.from(formData.getAll('file'))

      let items = []
      for (let i = 0; i < files.length; i++) {
        // get Buffer by converting File to ArrayBuffer, files[i].text() does not work
        const buffer = Buffer.from(await files[i].arrayBuffer())
        // finally get base64 from Buffer
        const base64 = buffer.toString('base64')

        console.log('file', files[i])
        console.log('buffer', buffer)

        const file = {
          base64: `data:${files[i].type};base64,${base64}`,
          size: files[i].size,
          type: files[i].type,
          name: files[i].name
        }
        items.push(file)
      }
    } catch (error) {
      return fail(422, error)
    }
  }
}

相关问题