如何使用 Meteor 将图像从 FileReader 上传到 Amazon s3

2024-02-01

我正在尝试使用 Meteor 构建一个图像上传器到 Amazon S3。感谢 Hubert OG,我发现AWS-SDK https://github.com/peerlibrary/meteor-aws-sdk这让事情变得简单。

我的问题是上传的数据似乎已损坏。当我下载文件时,它说该文件可能已损坏。大概是这样。

将数据插入图像 src 确实有效,并且图像的预览按预期显示,因此原始文件和数据可能是正确的。

我使用 FileReader 加载文件,然后将结果数据传递给 AWS-SDK putObject 方法。

        var file=template.find('[type=file]').files[0];
        var key="uploads/"+file.name;

        var reader=new FileReader();
        reader.onload=function(event){
            var data=event.target.result;
            template.find('img').src=data;
            Meteor.call("upload_to_s3",file,"uploads",reader.result);
        };

        reader.readAsDataURL(file);

这是服务器上的方法:

    "upload_to_s3":function(file,folder,data){
        s3 = new AWS.S3({endpoint:ep});
        s3.putObject(
            {
                Bucket: "myportfoliositebucket",
                ACL:'public-read',
                Key: folder+"/"+file.name,
                ContentType: file.type,
                Body:data
            },
            function(err, data) {
                if(err){
                    console.log('upload error:',err);
                }else{
                    console.log('upload was succesfull',data);
                }
            }
        );
    }

我将 npm 模块包装为智能包,在此处找到:https://atmosphere.meteor.com/package/s3policies https://atmosphere.meteor.com/package/s3policies

使用它,您可以创建一个返回写入策略的 Meteor 方法,并且使用该策略,您可以使用 ajax 调用上传到 S3。

Example:

Meteor.call('s3Upload', name, function (error, policy) {
    if(error)
        onFinished({error: error});
    var formData = new FormData();
    formData.append("AWSAccessKeyId", policy.s3Key);
    formData.append("policy", policy.s3PolicyBase64);
    formData.append("signature", policy.s3Signature);

    formData.append("key", policy.key);
    formData.append("Content-Type", policy.mimeType);
    formData.append("acl", "private");
    formData.append("file", file);

    $.ajax({
        url: 'https://s3.amazonaws.com/' + policy.bucket + '/',
        type: 'POST',
        xhr: function() {  // custom xhr
            var myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',
                    function (e){
                        if(e.lengthComputable)
                            onProgressUpdate(e.loaded / e.total * 100);

                }, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        success: function () {
            // file finished uploading
        },
        error: function () { onFinished({error: arguments[1]}); },
        processData: false,
        contentType: false,
        // Form data
        data: formData,
        cache: false,
        xhrFields: { withCredentials: true },
        dataType: 'xml'
    });
});

EDIT:

行中的“文件”变量:formData.append("file", file);来自与此类似的行:var file = document.getElementById('fileUpload').files[0];

服务器端代码如下所示:

Meteor.methods({
    s3Upload: function (name) {
        var myS3 = new s3Policies('my key', 'my secret key');

        var location = Meteor.userId() + '/' + moment().format('MMM DD YYYY').replace(/\s+/g, '_') + '/' + name;
        if(Meteor.userId()) {
            var bucket = 'my bucket';
            var policy = myS3.writePolicy(location, bucket, 10, 4096);
            policy.key = location;
            policy.bucket = bucket;
            policy.mimeType = mime.lookup(name);
            return policy;
        }
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Meteor 将图像从 FileReader 上传到 Amazon s3 的相关文章

  • 使用 Ruby aws-sdk 跟踪文件到 S3 的上传进度

    首先 我知道SO中有很多与此类似的问题 在过去的一周里 我读了大部分 如果不是全部 但我仍然无法让这项工作为我工作 我正在开发一个 Ruby on Rails 应用程序 允许用户将 mp3 文件上传到 Amazon S3 上传本身工作正常
  • MongoDB:如果使用 $addToSet 或 $push,是否应该预先分配文档?

    我一直在研究 MongoDB 我知道强烈建议在插入时完全构建 预分配 文档结构 这样将来对该文档的更改不需要移动该文档磁盘周围 这在使用 addToSet 或 push 时适用吗 例如 假设我有以下文档 id rsMH4GxtduZZfxQ
  • 如何在AWS策略中提供多个StringNotEquals条件?

    我正在尝试编写 AWS S3 存储桶策略 拒绝所有流量 除非来自两个 VPC 的流量 我正在尝试编写的策略如下所示 两者之间有逻辑与StringNotEquals 除非这是无效的政策 Version 2012 10 17 Id Policy
  • 从 S3 提供 Django 的静态文件和媒体文件

    我遇到了一个奇怪的问题 我不知道是什么原因造成的 这是我当前的配置 使用Heroku MEDIA URL media STATIC URL static STATICFILES DIRS os path join PROJECT DIR s
  • 如何中止/停止正在进行的 Amazon AWS s3 上传

    我正在使用 aws sdk 的 javascript 版本将文件上传到亚马逊 s3 存储桶 code AWS config update accessKeyId access key secretAccessKey secret key A
  • 可以使用带有 HTML5 播放器的 Amazon S3/CloudFront 流式传输视频吗?

    我想使用 HTML5 视频播放器并流式传输视频 S3 CloudFront 可以实现这一点吗 我了解 Amazon 使用 RTMP 流媒体协议和 HTML5video标签不支持 RTMP 有没有办法用 HTML5 播放器播放视频 Wayne
  • Amazon s3 – 403 禁止使用正确的存储桶策略

    我正在尝试使用以下存储桶策略 使存储在 s3 存储桶中的所有图像可供公开读取 Id Policy1380877762691 Statement Sid Stmt1380877761162 Action s3 GetObject Effect
  • mongodb 获取最后插入的文档

    此 Meteor 代码尝试查找集合中的最后一个文档 find userId this userId sort createdAt 1 limit 1 但由于所有文档都是按时间顺序排列的 我想删除createdAt字段 所以一旦被 删除 是否
  • AWS S3 预签名 URL 的 IAM 角色

    我正在 EC2 实例中部署一个服务器程序 该实例需要能够为 s3 创建预签名 URL 到目前为止 我已将 AWS 凭证放在环境变量中进行测试 但我现在想切换到 IAM 角色策略 但是 我不确定该角色也应该有权访问哪些策略 我最初的猜测是拥有
  • AWS boto3 page_iterator.search 无法将 datetime.datetime 与 str 进行比较

    尝试捕获 s3 上的增量文件 上次处理后创建的文件 为此 请使用 boto3 过滤迭代器通过查询 LastModified 值而不是返回所有文件列表并在客户端站点上进行过滤 根据http jmespath org http jmespath
  • 使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?

    是否可以使用 lambda 函数添 加或更新 s3 对象元数据而不复制对象 这篇 2 年前的帖子说我们确实需要复制一份 https stackoverflow com questions 32646646 how do i update m
  • S3 上上传文件的 MIME 类型

    如何更改 Amazon S3 上上传文件的 MIME 类型 我尝试过http docs amazonwebservices com AWSSDKforPHP latest m Amazon S3 更改内容类型 http docs amazo
  • Spark s3 写入(s3 与 s3a 连接器)

    我正在从事一项在 EMR 上运行的作业 它在 s3 上保存了数千个分区 分区为年 月 日 我有过去 50 年的数据 现在 当 Spark 写入 10000 个分区时 使用以下命令大约需要 1 小时s3a联系 它非常慢 df repartit
  • 尝试安装 AWS CLI,卡在一个步骤上

    我正在尝试为 mac 命令行安装 aws 我想我不明白我需要做什么 我在终端上安装了带有 wget 的 aws 捆绑包 解压后它完成了所有操作 但是当我需要配置我的凭据时 什么也没有出现把aws配置 以下是说明 http docs aws
  • Amazon S3 EPIPE 错误

    UPDATE 让它工作从命令行 http www timkay com aws 向该用户添加完全访问策略权限后 现在 当我使用 Node 执行此操作时 没有错误 但我在 s3 文件管理器中看不到这些文件 我在使用 Amazon 的 S3 服
  • S3 静态网站中的目录列表

    我已经设置了一个 S3 存储桶来托管静态文件 使用网站端点 http s3 website us east 1 amazonaws com 时 它迫使我设置一个索引文件 当找不到文件时 它会抛出错误而不是列出目录内容 使用 s3 端点 s3
  • 将 mongo 数组转换为具有键值对的对象

    我有一个包含字符串数组的 mongo 文档 我需要将这个特定的字符串数组转换为包含键值对的对象数组 以下是我目前的做法 id ObjectId 57e3720836e36f63695a2ef2 platform A1 available C
  • AWS CLI s3 复制失败并出现 403 错误,尝试管理用户上传的对象

    尝试将文件从 S3 存储桶复制到我的本地计算机 aws s3 cp s3 my bucket name audio 0b7ea3d0 13ab 4c7c ac66 1bec2e572c14 wav fatal error An error
  • 从 Grails 控制器渲染视频内容

    毫无疑问又是一个愚蠢的新手问题 我在 Grails 控制器中有一个字节数组 其中包含视频文件 确切地说是 mp4 文件 的内容 我熟悉如何从 grails 控制器渲染 JSON XML 和其他基本类型 但我找不到任何显示如何输出视频的示例
  • Cognito/IAM 策略和 S3 获取对象

    我正在尝试将 S3 和 Cognito 集成到我的 iOS 应用程序中 但到目前为止尚未成功 我相信该错误与我针对 Auth 和 Unauth 用户的 IAM 策略有关 所以这是我的政策 Version 2012 10 17 Stateme

随机推荐