javascript - 将 Canvas 图像上传到 S3 服务器

标签 javascript upload html5-canvas amazon

有人可以告诉我如何使用 AWS JavaScript 将 Canvas 图像上传到 S3 服务器吗?

我在使用 JavaScript SDK 将图像上传到 Amazon S3 服务器时遇到了一些麻烦,需要实现以下目标。

-> 在 HTML5 Canvas 上创建图像并在 JavaScript 中调整图像大小。

-> 然后将图像上传到 Amazon S3 服务器。

但问题是:

*) 在将图像上传到 S3 服务器时,它是在 S3 上上传图像像素信息而不是图像。

因此,在 S3 浏览器预览中,使用以下代码显示图像流而不是图像。

此外,AWS Javascript 支持以下格式的 Body 缓冲区、类型化数组、Blob、字符串、ReadableStream。

代码如下:

HTML代码

<canvas id="myCanvas" width="800" height="800" style="background-color: greenyellow;">Your browser doesn't support html5! Please download the latest version.
</canvas>
<input type="button" id="upload-button" value="Upload to S3" />

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.0.4.min.js"></script>



<script type="text/javascript">
        AWS.config.update({ accessKeyId: 'ACCESSKEY', secretAccessKey: 'SECRETKEY' });
        AWS.config.region = 'ap-southeast-1';

         $(function () {

         $("#upload-button").click(OnUpload);    

         });

         function OnUpload(){

            var canvas = document.getElementById("myCanvas");
            var ctx = canvas.getContext("2d");

            var img = new Image();
            img.src = 'Images/IMG_0001.JPG';

            img.onload = function () {
            <!--image resize -->
             var MAX_WIDTH = 200;
                var MAX_HEIGHT = 200;
                var width = img.width;
                var height = img.height;

                if (width > height) {
                    if (width > MAX_WIDTH) {
                        height *= MAX_WIDTH / width;
                        width = MAX_WIDTH;
                    }
                } else {
                    if (height > MAX_HEIGHT) {
                        width *= MAX_HEIGHT / height;
                        height = MAX_HEIGHT;
                    }
                }
                canvas.width = width;
                canvas.height = height;
                ctx.drawImage(img, 0, 0, width, height);

                <!--image resize end-->

                var imageData = ctx.getImageData(0, 0, width, height);
                var typedArray = imageData.data;

                var bucket = new AWS.S3({ params: { Bucket: 'bucketName' } });
                var results = document.getElementById('results');
                results.innerHTML = '';
                var params = { Key: "sample.png", ContentType: "image/png", Body: typedArray };

                bucket.putObject(params, function (err, data) {
                    results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';

                });                
            }           
         }

</script>

有人可以告诉我怎么做吗? 提前致谢...

最佳答案

对于仍然面临问题的人,这将节省一些时间:

var canvas  = document.getElementById("imagePreviewChatFooter");
                    var dataUrl = canvas.toDataURL("image/jpeg");
                    var blobData = dataURItoBlob(dataUrl);
                    var fileName = file.name;
                    var params = {Key: fileName, ContentType: file.type, Body: blobData};
                    bucket.upload(params, function (err, data) {
                        console.log(data);
                        console.log(err ? 'ERROR!' : 'UPLOADED.');
                    });

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'});
}

关于javascript - 将 Canvas 图像上传到 S3 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24694629/

相关文章:

javascript - PSD.js 字体颜色代码毫无意义

javascript - 日期选择器在 Internet Explorer 中不起作用

javascript - 如何在 CSS/JAVASCRIPT 中将图像转换为灰度

javascript - HTML5/Javascript - 尝试将 Canvas 动画绑定(bind)到键盘事件

javascript - 在 Javascript 中使用 View 模型

javascript - 使用 jquery 重新选择所有复选框会导致奇怪的操作

google-chrome-extension - 在 Google Chrome 扩展程序中上传文件

python - GAE Python 如何检查上传的文件类型

c - 性能 libssh2 sftp 上传多个文件

javascript - 从类似 Blob 的图像的(内部和外部)边缘创建路径