我一直在try 重新实现一个HTML5图像上传程序,比如one on the Mozilla Hacks网站,但它适用于WebKit浏览器.部分任务是从canvas对象中提取一个图像文件,并将其附加到FormData对象中进行上传.

问题在于,虽然canvas具有toDataURL函数来返回图像文件的表示,但FormData对象只接受来自File API的文件或Blob对象.

Mozilla解决方案在canvas上使用了以下仅限Firefox的功能:

var file = canvas.mozGetAsFile("foo.png");

.这在WebKit浏览器上不可用.我能想到的最好的解决方案是找到某种方法将数据URI转换为File对象,我认为它可能是File API的一部分,但我无论如何也找不到这样做的方法.

有可能吗?如果没有,还有其他 Select 吗?

谢谢.

推荐答案

在玩了一些东西之后,我自己设法弄明白了这一点.

首先,这会将dataURI转换为Blob:

function dataURItoBlob(dataURI) {
    // convert base64/URLEncoded data component to raw binary data held in a string
    var byteString;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(dataURI.split(',')[1]);
    else
        byteString = unescape(dataURI.split(',')[1]);

    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

    // write the bytes of the string to a typed array
    var ia = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    return new Blob([ia], {type:mimeString});
}

从这里开始,将数据附加到表单中,以便将其作为文件上传是很容易的:

var dataURL = canvas.toDataURL('image/jpeg', 0.5);
var blob = dataURItoBlob(dataURL);
var fd = new FormData(document.forms[0]);
fd.append("canvasImage", blob);

Javascript相关问答推荐

Flutter:显示PDF和视频,但阻止下载

JavaScript Date对象在UTC中设置为午夜时显示不正确的日期

自定义帖子类型帖子未显示在网站上

为什么我的第二个OnClick Isloading值在TEK查询Mutations 查询中不起作用?

Angular:ng-contract未显示

Flisk和JS错误:未捕获的Syntax错误:意外的令牌'<'

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

如何判断属于多个元素的属性是否具有多个值之一

模块与独立组件

togglePopover()不打开但不关闭原生HTML popover'

虚拟滚动实现使向下滚动可滚动到末尾

如何在coCos2d-x中更正此错误

rxjs插入延迟数据

本地库中的chartjs-4.4.2和chartjs-plugin-注解

查询参数未在我的Next.js应用路由接口中定义

JavaScript是否有多个`unfined`?

JavaScript不重定向配置的PATH

Next.js无法从外部本地主机获取图像

本地损坏的Java脚本

FindByIdAndUpdate在嵌套对象中创建_id