【问题标题】:Convert base64 image created with canvas to binary data and post to Dropbox API将使用画布创建的 base64 图像转换为二进制数据并发布到 Dropbox API
【发布时间】:2019-11-27 02:16:41
【问题描述】:

目前正在努力做到这一点,我现在认为处理这个服务器端可能会更好,但是就这样吧。

我目前正在创建一个小应用程序,它使用 HTML 画布获取用户绘制的签名,并使用他们的 API 将其上传到 Dropbox:

const Canvas = () => {
    const [imageURL, setImageURL] = useState('');

    window.addEventListener('load', () => {
        const canvas = document.querySelector('#canvas');
        const ctx = canvas.getContext('2d');
        const rect = canvas.getBoundingClientRect();
        const clear = document.getElementById('clear');

        // Resizing
        canvas.height = 300;
        canvas.width = 600;

        // Vars
        let painting = false;

        function startPosition(e) {
            painting = true;
            draw(e);
        }

        function finishedPosition() {
            painting = false;
            ctx.beginPath();
            const newSignature = canvas.toDataURL();
            setImageURL(newSignature);
        }

        function draw(e) {
            if (!painting) return;
            ctx.lineWidth = 2;
            ctx.lineCap = 'round';

            ctx.lineTo(e.clientX - rect.left, e.clientY - rect.top);
            ctx.stroke();
            ctx.beginPath();
            ctx.moveTo(e.clientX - rect.left, e.clientY - rect.top);
        }

        function clearCanvas() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            setImageURL('');
        }

        // Listeners
        canvas.addEventListener('mousedown', startPosition);
        canvas.addEventListener('mouseup', finishedPosition);
        canvas.addEventListener('mousemove', draw);
        clear.addEventListener('click', clearCanvas);
    });

    function uploadFile() {
        axios.post(
            'https://content.dropboxapi.com/2/files/upload',
            { data: imageURL },
            {
                headers: {
                    Authorization: 'Bearer TOKEN_HERE',
                    'Content-Type': 'application/octet-stream',
                    'Dropbox-API-Arg': '{"path": "/signature","mode": "add","autorename": true,"mute": false}',
                },
            },
        );
    }

    return (
        <Fragment>
            <div className={styles.wrapper}>
                <canvas id="canvas" className={styles.nwicanvas} />
                <Button buttonId="clear">Clear</Button>
                <h3 className={styles.title}>Signature preview</h3>
                {imageURL !== '' ? <img src={imageURL} alt="signature" /> : <p>No signature drawn.</p>}
                {imageURL !== '' ? <a download="signature.png" href={imageURL}>Download</a> : null}
                {imageURL !== '' ? <Button onClick={uploadFile}>Upload</Button> : null}
            </div>
        </Fragment>
    );
};

这可以使用 .toDataURL() 函数创建 base64 图像,该函数非常适合向用户显示预览,但是当我将数据发送到 Dropbox 时,它最终成为损坏的图像。我也尝试将 base64 图像转换为 blob,但我得到另一个损坏的图像。

我认为不可能将此 base64 图像转换为 Javascript 中的原始二进制数据并将其发送出去?

非常感谢任何帮助。

【问题讨论】:

  • Blob 对我来说很好用。您可能误解了axios.post API。您不是在发送原始数据,而是在此行的代码中具有 data 属性的对象:{ data: imageURL }。
  • @PetrSrníček 原始数据是我需要的。你说得对。这已使用toBlob 方法解决。谢谢。

标签: javascript html5-canvas dropbox-api


【解决方案1】:

BLOB(二进制大对象)就是这样 - 二进制数据。我建议坚持使用它而不是数据 URL。它对我来说就像一个魅力:

function uploadToDropbox(data) {
  const config = {
    headers: {
      Authorization: 'Bearer <token here>',
      'Content-Type': 'application/octet-stream',
      'Dropbox-API-Arg': '{"path": "/test.png","mode": "add","autorename": true,"mute": false}',
    },
  };

  axios.post('https://content.dropboxapi.com/2/files/upload', data, config);
}

canvas.toBlob(uploadToDropbox, 'image/png');

【讨论】:

  • 我刚刚意识到HTMLCanvasElement/toBlob() 的可用性相当有限。它在 Edge 和旧版浏览器中不可用,因此您可能需要通过数据 URL。此线程中提供了几种将数据 URL 转换为 blob 的解决方案:stackoverflow.com/questions/16245767/…
  • 或者为 canvas.toBlob 使用 polyfill(不是我的):jsfiddle.net/IsArlekin/obv5j64f/7
  • 是的,我也注意到了这一点。然而,有一种专门用于 Edge/IE 的方法,称为 msToBlob()。不知道这有多么骇人听闻。
猜你喜欢
  • 2017-08-05
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2012-06-14
相关资源
最近更新 更多