2013-10-24 37 views
12

Tôi đang cố tải các tệp lên Thùng S3 S3 của tôi. S3 và amazon được thiết lập. Đây là thông báo lỗi từ Amazon:Cách tải tệp lên Amazon S3 bằng Meteor?

mâu thuẫn thông số chuỗi truy vấn: acl, chính sách

Chính sách và chữ ký được mã hóa, với Crypto.js cho Node.js

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

Tôi đang cố gắng xây dựng yêu cầu POST bằng phương pháp Meteor HTTP.post. Điều này cũng có thể sai.

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

Đây là yêu cầu POST Tôi đang sử dụng với Meteor:

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

và cô ấy tôi đang mã hóa các chính sách và chữ ký:

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 không thể hình ra những gì đang xảy ra. Có thể đã xảy ra sự cố ở phương thức POST hoặc mã hóa vì tôi không biết các phương pháp này quá tốt. Nếu ai đó có thể chỉ cho tôi đúng hướng, để mã hóa hoặc gửi yêu cầu POST đến AmazonS3 đúng cách, nó có thể giúp ích rất nhiều.
(Tôi không muốn sử dụng filepicker.io, bởi vì tôi không muốn để buộc khách hàng phải đăng ký đó là tốt.)

Cảm ơn trước !!!

+0

queryString không giống như các tham số POST, có thể bạn cần sao chép hai tham số bị phàn nàn về url GET ... – dandavis

Trả lời

5

cập trực tiếp đến S3 bạn có thể sử dụng slingshot gói:

meteor add edgee:slingshot 

Về phía server tuyên bố chỉ thị của bạn:

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

Chỉ thị này sẽ tự động tạo chính sách và chữ ký.

Và họ chỉ cần tải nó như thế này:

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}}); 
}); 
+0

Đây là một câu hỏi khá cũ và có không có gói súng cao su vào thời điểm đó. Bây giờ có, và nó khá tốt. Tải lên các tệp trực tiếp từ trình duyệt, vì vậy tôi chấp nhận câu trả lời này, thay vào đó Hubert hoạt động trên máy chủ. Cảm ơn bạn đã chia sẻ! – zalavari

4

Tại sao bạn không sử dụng gói aws-sdk? Nó gói tất cả các phương pháp cần thiết cho bạn. Ví dụ, đây là chức năng đơn giản để thêm một tập tin bộ chứa:

s3.putObject({ 
    Bucket: ..., 
    ACL: ..., 
    Key: ..., 
    Metadata: ..., 
    ContentType: ..., 
    Body: ..., 
}, function(err, data) { 
    ... 
}); 
+1

Cảm ơn, điều này có thể rất rõ ràng. Tôi thậm chí không biết Làm thế nào tôi bỏ lỡ gói này. Im đi thử nó ra đúng. – zalavari

+0

Tôi làm việc, cảm ơn. Nhưng vẫn gặp sự cố với dữ liệu đã tải lên ... – zalavari

+0

Bạn có gửi đúng không? Nó có thể là một chút khó khăn. Nếu bạn gặp sự cố với cấu hình, hãy mở một câu hỏi mới lý tưởng vì đó là một vấn đề khác. –

1

kiểm tra ra các gói S3 sao băng. Readme có hướng dẫn rất toàn diện về cách bắt đầu

0

Điều đầu tiên là thêm gói để tải lên tệp s3.

Đối với cài đặt: ADD (AWS SDK thông minh trọn gói) $ meteor add peerlibrary: aws-sdk

1.Create Chỉ upload.js và dán đoạn mã này.

angular.module('techno') 
.directive("fileupload", [function() { 
    return { 
     scope: { 
      fileupload: "=" 
     }, 
     link: function(scope,element, attributes){ 
      $('.button-collapse').sideNav(); 
      element.bind("change", function (event) { 
       scope.$apply(function() { 
       scope.fileupload = event.target.files[0]; 
      }); 
      }) 
     }}; 
}]); 

2.Nhận khóa Truy cập và dán nó vào tệp fileUpload.js của bạn.

AWS.config.update({ 
accessKeyId: ' AKIAJ2TLJBEUO6IJLKMN ', 
secretAccessKey: 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' 
}); 

AWS.config.region = 'us-east-1'; 
let bucket = new AWS.S3(); 

3.Now đặt mã tải lên này trong chỉ thị của bạn fileUpload.js

vm.upload = (Obj) =>{ 
vm.loadingButton = true; 
let name = Obj.name; 
let params = { 
    Bucket: 'technodheeraj', 
    Key: name, 
    ContentType: 'application/pdf', 
    Body: Obj, 
    ServerSideEncryption: 'AES256' 
}; 

bucket.putObject(params, (err, data) => { 
    if (err) { 
     console.log('---err------->', err); 
    } 
    else { 
     vm.fileObject = { 
      userId: Meteor.userId(), 
      eventId: id, 
      fileName: name, 
      fileSize: fileObj.size, 
     }; 
    vm.call("saveFile", vm.fileObject, (error, result) => { 
      if (!error){ 
       console.log('File saved successfully'); 

      } 
     }) 
    } 
}) 

}; 

4.Now trong phương pháp “savefile” dán mã này

saveFile: function(file){ 
if(file){ 
    return Files.insert(file); 
} 

}; 

5.In HTML dán mã này

<input type="file" name="file" fileupload="file"> 
<button type="button" class="btn btn-info " ng-click="vm.upload(file)"> Upload File</button> 
Các vấn đề liên quan