【问题标题】:Sending canvas.toDataURL() as FormData将 canvas.toDataURL() 作为 FormData 发送
【发布时间】:2018-06-20 02:22:36
【问题描述】:

我正在尝试使用 html2canvas 将 DOM 元素呈现为 .png 图像,然后我想将其上传到服务器。这是我的代码:

import React, { Component, PropTypes } from 'react';
import html2canvas from 'html2canvas';
import axios from 'axios';


const sendScreenshot = (img) => {
  const config = {
      headers: {
          'content-type': 'multipart/form-data'
      }
  }
  let data = new FormData();
  data.append('screenshot', img);      
  return axios.post('/api/upload', data)
}

export default class Export extends Component {

  printDocument() {
    const input = document.getElementById('divToPrint');
    html2canvas(input).then(canvas => {
      document.body.appendChild(canvas);
      const imgData = canvas.toDataURL('image/png');
      sendScreenshot(imgData)
    });
  }

  ...

我可以看到 DOM 元素正在正确地转换为图像,因为我可以看到它附加到页面上。

在 node.js 服务器端,我可以看到表单正在通过,但“屏幕截图”是作为文本字段而不是文件接收的。我正在使用 multer,并且我确认我可以正确接收和保存文件上传,至少在我使用 Postman 时是这样。

所以我想基本问题是我需要指出我附加到 FormData 的项目是一个文件,而不是一个文本字段。但我不知道该怎么做。我尝试将 append 与三个参数一起使用,并尝试将 imgData 转换为如下所示的 blob:

const blob = new Blob([img], {type: 'image/png'});

但结果并没有让我更接近我想要的。

【问题讨论】:

  • 您不想使用 toDataURL。相反,您想使用 canvas.toBlob 方法。然后将 blob 添加到 FormData。
  • 成功了,谢谢。

标签: javascript reactjs multipartform-data multer


【解决方案1】:

要在 POST 请求中发送二进制数据,您需要使用 Blob。 Blob 表示原始二进制数据。要获取画布的 Blob,可以使用 toBlob 方法。

获得 Blob 实例后,您可以使用 append 方法将 Blob 添加到 FormData。 append 方法接受 Blob 实例作为第二个参数。您甚至可以将可选的第三个参数传递给 append 以指定要与 Blob 一起发送到服务器的文件名。

blob 将作为文件数据在服务器上接收。

一个实际的例子:

const canvas = document.getElementById('my-canvas');
canvas.toBlob(function(blob) {
  const formData = new FormData();
  formData.append('my-file', blob, 'filename.png');

  // Post via axios or other transport method
  axios.post('/api/upload', formData);
});

【讨论】:

  • 一个小代码 sn-p 显示这一点会有很长的路要走。
  • @StevenJeffries 谢谢小费。我添加了一个示例。
  • @TamaghnaBanerjee 它在什么方面不起作用?你得到什么错误?也许我可以帮助你。
  • 表单数据不像文件上传那样发送,我实际上创建了一个 API,它接受并期望文件上传为表单数据,就像我们通过上传按钮执行的传统文件上传一样。我想使用相同的过程,只是将画布数据转换为该格式。可行吗?
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2012-04-04
相关资源
最近更新 更多