Как я могу проверить из мокко/суперагента вызов загрузки CORS на amazon-s3?

У меня возникают проблемы с попыткой отправить запрос CORS от суперагента к Amazon S3 для загрузки файла. Во-первых, я запрашиваю политику у сервера node.js. Я возвращаю объект JSON следующим образом:

{
    s3PolicyBase64: '',
    s3Signature: '',
    s3Key: '',
    s3ObjectKey: 'ftriana3185/inputData/input_fdc2f7f4b050c5884e5ac60a43bfc0d8ff26d549.csv' }

Затем я пытаюсь из суперагента использовать политику, возвращенную узлом, для загрузки локального файла. Мой код выглядит так:

it('GET /inputFiles/s3Credential', function(done) {
    var csvPath = './files/inputFileResource/countrylist.csv';
    var request = {};
    request.ext = 'csv';

    clientAgent.get(localPath + '/inputFiles/s3Credential').send(request).end(function(response) {
        var s3PolicyBase64 = response.body.s3PolicyBase64;
        var s3Signature = response.body.s3Signature;
        var s3Key = response.body.s3Key;
        var s3ObjectKey = response.body.s3ObjectKey;

        var request = clientAgent.post('bucket-name.s3.amazonaws.com')
            .type('form')
            .field('key', s3ObjectKey)
            .field('AWSAccessKeyId', s3Key)
            .field('acl', 'public-read')
            .field('policy', s3PolicyBase64)
            .field('signature', s3Signature)
            .attach('mycsv', csvPath).end(function(response){
                console.log(response);
            });
    });
});

Я уверен, что проблема в форме, в которой я делаю запрос от суперагента, потому что у меня также есть html-форма, которая отлично работает. Итак, как правильно использовать суперагент для этой цели?


person Felo    schedule 30.01.2014    source источник


Ответы (1)


Я попытался сделать именно это сегодня и обнаружил, что это не работает с HTTP 400. Я предполагаю, что суперагент не соблюдает точный макет формы, описанный в http://aws.amazon.com/articles/1434.

Я рекомендую вместо этого использовать модуль «form-data» (https://github.com/felixge/node-form-data).

Это сработало для меня:

var FormData = require('form-data');
var fs = require('fs');

...

it('should upload to S3 with a multipart form', function (done) {
    var policy = {/* your S3 policy */};
    var form = new FormData();
    form.append('AWSAccessKeyId', policy.AWSAccessKeyId);
    form.append('key', policy.key);
    form.append('policy', policy.policy);
    form.append('signature', policy.signature);
    form.append('file', fs.createReadStream('path/to/file'));
    form.submit('https://YOUR_BUCKET.s3.amazonaws.com/', function (err, res) {
        if (err) return done(err);
        res.statusCode.should.be.exactly(204);
        done();
    });
});
person extrabacon    schedule 13.02.2014