ArrayBuffer 到二进制图像文件

ArrayBuffer to binary image file

我正在使用一个 React 组件作为我的 MarkDown 编辑器。该组件提供了一个 dropzone 来粘贴文件,它接受一个回调函数,该回调函数传递给文件(主要是图像文件)的 ArrayBuffer。后端需要一个图像文件,就像通过表单上传一样。但是返回 ArrayBuffer 而不是文件已被证明是一个问题。

我已尝试将 ArrayBuffer 转换为 Blob,但后端仍然需要来自上传文件的其他信息,例如二进制图像文件中存在的文件名和大小。 我将不胜感激任何帮助!谢谢。

示例如下:

function converArrayBufferToImage(ab) {
    // Obtain a blob: URL for the image data.
    return new Blob([ab])
}

export default function ReactMdEditor(props) {
    const { value, setValue } = props;

    const save = async function* (file) {
        let fileData = new FormData()
        let convertedFile = converArrayBufferToImage(file)
        fileData.append('file', convertedFile);
        try {
            const response = yield uploadFile(fileData);
            const data = response.data;
            yield data.url;
            return true;
        } catch (error) {
            console.log(error);
            return false;
        }
    };

    return (
        <div>
            <ReactMde
                value={value}
                onChange={setValue}
                childProps={{
                    writeButton: {
                        tabIndex: -1
                    }
                }}
                paste={{
                    saveImage: save
                }}
            />
        </div>
    );
}

编辑:如果上下文需要,我的后端是使用 Python、Flask 构建的。

好的,看来我找到了解决办法

下面是保存函数:

    const save = async function* (file) {
    try {
        const blobFile = new Blob([file], { "type": "image/png" });
        let formData = new FormData()
        formData.append('file', blobFile, 'file.png');
        try {
            const response = await uploadFile(formData);
            const data = response.data;
            yield data.url;
            return true;
        } catch (error) {
            console.log(error);
            return false;
        }
    } catch (e) {
        console.warn(e.message)
        return false;
    }
};

您需要在客户端或服务器上生成一个唯一的文件名,以便不覆盖具有相同名称的现有文件(如果您还没有的话)。

如果有人需要,解释这个函数的作用:如果只是传递一个数组缓冲区,将其转换为图像 Blob,并将其上传到服务器,后者返回 url 其中文件已保存。 我希望这可以帮助某人并在某个时候拯救他们。