12

Amazon S3 バケットにファイルをアップロードしようとしています。S3 と amazon がセットアップされます。これは、Amazon からのエラー メッセージです。

競合するクエリ文字列パラメーター: acl、policy

Node.js用のCrypto.jsを使用して、ポリシーと署名がエンコードされます

var crypto=Npm.require("crypto");

Meteor HTTP.post メソッドで POST リクエストを構築しようとしています。これも間違っている可能性があります。

    var BucketName="mybucket";
    var AWSAccessKeyId="MY_ACCES_KEY";
    var AWSSecretKey="MY_SECRET_KEY";

    //create policy
    var POLICY_JSON={
        "expiration": "2009-01-01T00:00:00Z",
            "conditions": [ 
            {"bucket": BucketName}, 
            ["starts-with", "$key", "uploads/"],
            {"acl": 'public-read'},
            ["starts-with", "$Content-Type", ""],
            ["content-length-range", 0, 1048576],
        ]   
    }
    var policyBase64=encodePolicy(POLICY_JSON);
    //create signature
    var SIGNATURE = encodeSignature(policyBase64,AWSSecretKey);
    console.log('signature: ', SIGNATURE);

これは、Meteor で使用している POST リクエストです。

    //Send data----------
    var options={
        "params":{
            "key":file.name,
            'AWSAccessKeyId':AWSAccessKeyId,
            'acl':'public-read',
            'policy':policyBase64,
            'signature':SIGNATURE,
            'Content-Type':file.type,
            'file':file,
            "enctype":"multipart/form-data",
        }
    }

    HTTP.call('POST','https://'+BucketName+'.s3.amazonaws.com/',options,function(error,result){
        if(error){
            console.log("and HTTP ERROR:",error);
        }else{
            console.log("result:",result);
        }
    });

そして彼女は私がポリシーと署名をエンコードしています:

encodePolicy=function(jsonPolicy){
    // stringify the policy, store it in a NodeJS Buffer object
    var buffer=new Buffer(JSON.stringify(jsonPolicy));
    // convert it to base64
    var policy=buffer.toString("base64");
    // replace "/" and "+" so that it is URL-safe.
    return policy.replace(/\//g,"_").replace(/\+/g,"-");
}

encodeSignature=function(policy,secret){
    var hmac=crypto.createHmac("sha256",secret);
    hmac.update(policy);
    return hmac.digest("hex");
}

Aは何が起こっているのか理解できません。私はこれらのメソッドをよく知らないので、POST メソッドまたは暗号化に既に問題がある可能性があります。誰かが私を正しい方向に向けたり、エンコードしたり、POST リクエストを AmazonS3 に適切に送信したりすることができれば、大いに役立ちます。
(クライアントに強制的にサインアップさせたくないので、filepicker.ioを使用するのは好きではありません。)

前もって感謝します!!!

4

4 に答える 4

6

S3 への直接アップロードには、 slingshotパッケージを使用できます。

meteor add edgee:slingshot

サーバー側でディレクティブを宣言します。

Slingshot.createDirective("myFileUploads", Slingshot.S3Storage, {
  bucket: "mybucket",
  allowedFileTypes: ["image/png", "image/jpeg", "image/gif"],

  acl: "public-read",

  authorize: function () {
    //You can add user restrictions here
    return true;
  },

  key: function (file) {
    return file.name;
  }
});

このディレクティブは、ポリシーと署名を自動的に生成します。

そして、彼らはそれを次のようにアップロードするだけです:

var uploader = new Slingshot.Upload("myFileUploads");

uploader.send(document.getElementById('input').files[0], function (error, url) {
  Meteor.users.update(Meteor.userId(), {$push: {"profile.files": url}});
});
于 2014-11-27T19:45:34.070 に答える