Как передать дополнительные данные от клиента в slingshot s3storage?

Я пытаюсь передать идентификатор пользователя из FlowRouter.getParam('id'); на сервер, чтобы загрузить файл в Amazon. Это учетная запись администратора, поэтому я использую FlowRouter.getParam('id'); чтобы получить доступ к правильной информации профиля пользователя. Проблема в том, что я неправильно передаю идентификатор, так что все это просто ошибки и перестает работать.

Как правильно передать идентификатор?

Дорожка uploadFile.js

let _uploadFileToAmazon = ( file ) => {
  var id = FlowRouter.getParam('id');
  const uploader = new Slingshot.Upload( "uploadProfileImgAdmin", id );
  uploader.send( (file), ( error, url ) => {
    if ( error ) {
      Bert.alert( error.message, "warning" );
      _setPlaceholderText();
    } else {
      _addUrlToDatabase( url );
    }
  });
};

Дорожка server/uploadFile.js

Slingshot.createDirective( "uploadProfileImgAdmin", Slingshot.S3Storage, {
  bucket: "bhr-app",
  region: "ap-southeast-2",
  acl: "public-read",
  authorize: function (id) {
    console.log("user id: ", id);
    return Files.findOne( { "userId": id } );
  },
  key: function ( file ) {
    var user = Meteor.users.findOne( _id: id );

    return "profile-images" + "/" + user.emails[0].address + "/" + file.name;
  }
});

1 ответ

Решение

Прежде всего, чтобы получить идентификатор текущего пользователя, вы должны использовать this.userId на сервере в authorize метод, а не просто доверять данным, переданным клиентом (чтобы убедиться, что пользователь на самом деле является администратором и проверить параметры).

Мета-контекст, добавляемый к загрузке, должен быть объектом (вы передаете строку), и он доступен как второй параметр ваших методов директивы.

const uploader = new Slingshot.Upload("uploadProfileImgAdmin", {id});

И на сервере методы вашей директивы получают file и meta вы прошли:

Slingshot.createDirective( "uploadProfileImgAdmin", Slingshot.S3Storage, {
  bucket: "bhr-app",
  region: "ap-southeast-2",
  acl: "public-read",
  authorize: function (file, meta) {
    console.log("user id: ", meta.id);
    // validate meta, make sure that the user is an admin and 
    // return a Boolean or throw an error
  },
  key: function (file, meta) {
    var user = Meteor.users.findOne(meta.id);
    return "profile-images" + "/" + user.emails[0].address + "/" + file.name;
  }
});
Другие вопросы по тегам