将画布数据上传到S3

21

现在亚马逊启用了 CORS,我想知道这是否可能。

客户端浏览器上的 canvas 数据能否直接转换为 某种格式 并上传到 S3 呢?

我确定我可以向亚马逊发起一个 PUT 请求,但是这需要一个 文件

我可以获取 base64 编码的图像数据甚至是一个 Blob,但是有没有一种方法可以从客户端浏览器将其保存为图像并上传到 S3

有没有一种将 canvas 转换为 文件 的方法,以便我可以发起 PUT 请求,或者亚马逊可以理解 Blob 并将其保存为图像?


1
这是可以做到的。在这里解释起来可能会比较长。但如果有人感兴趣,我可以写下来。 - Gaurav Shah
我很想知道您是如何将 dataURL 转换为亚马逊可识别的 blob 的。 - Raphael Rafatpanah
1
@RaphaelRafatpanah `function canvasToBase64(canvas_id) { var base64 = "" try{ base64 = document.getElementById(canvas_id).toDataURL('image/jpeg',0.8); } catch(e){ // 如果不支持jpeg转换,则回退 base64 = document.getElementById(canvas_id).toDataURL(); } // 移除格式类型 base64 = base64.replace(/^data:image\/(png|jpg|jpeg);base64,/, ""); return base64; }` - Gaurav Shah
5个回答

22

以下是一个可行的示例,您可以从画布中获取数据 URL 并将其上传到 S3:

var dataUrl = canvas.toDataURL("image/jpeg");
var blobData = dataURItoBlob(dataUrl);
var params = {Key: "file_name", ContentType: "image/jpeg", Body: blobData};
bucket.upload(params, function (err, data) {});

dataURItoBlob

function dataURItoBlob(dataURI) {
    var binary = atob(dataURI.split(',')[1]);
    var array = [];
    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
}

2
谢谢你,Jungli。你救了我的命。 - Midhun Vijayakumar
4
我感觉我错过了一些很蠢的东西,但是file.namefile.type在哪里被定义了?它们应该是文件名的(硬编码)字符串和"image/jpeg"这样的ContentType吗? - Lee Campbell
我在这个例子中假设网站要求用户上传一张图片,该图片会显示在画布上并进行某种编辑/操作,然后网站将其推回到S3以相同的名称/类型。 - Overcode
bucket.upload来自哪里? - jojo33

3

1

这是最好的答案。 - Travis

1
使用 toBlob
canvas.toBlob((blob) => {
  if (blob === null) return;
  bucket.upload({
    Key: "where/the/file/goes.jpg"
    ContentType: "image/jpeg",
    Body: blob,
  }, (err, data) => {});
}, "image/jpeg");

-3

保存画布最简单的方法是将其转换为base64格式:

canvas.toDataURL();

或者您可以通过参数设置图像类型:

canvas.toDataURL("image/png");
canvas.toDataURL("image/jpeg");
// etc

同时也关注这个库: http://www.nihilogic.dk/labs/canvas2image/


OP已经说过他们可以获取Base64编码的数据(显然他们也知道atob函数)。 - katspaugh
我该如何处理 base64?我希望将其保存为 s3 上的文件。 - Gaurav Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接