使用 Meteor Edgee:SlingShot 包时如何在上传前修改文件名

How To Modifying The Filename Before Uploading When Using Meteor Edgee:SlingShot Package

我正在尝试修改用户发布的选定文件的文件名,然后再使用 edgee:slinghot 程序包上传到 Amazon S3。我可以很好地上传文件,但问题是如何修改文件名。 我通过将修改后的名称保存到变量中来在客户端修改它。我现在的问题是如何在服务器环境中访问在客户端上声明和保存的变量。我似乎无法理解它。

    'change .js-submitTeamPaper' : function(event , template){

       event.preventDefault();
       let paper = template.paperDetails.get();
       newFilename = paper[0].paper_name + "_"
       _.map(paper[0].member , (member)=>{
        newFilename +=  "_" + member.regnum + "_"
      });
      newFilename += paper[0]._id;
      let file = event.target.value;
      let fileArray = file.split(".");
      let ext = fileArray[fileArray.length - 1];
      newFilename += "." + ext;

   studentFileUpload(event , template , 'submitTeamTermPaper' ,  'divProgress');

    }

上传文件的代码。

 let _collectfile = (event , template) =>{
    let file = event.target.files[0]
    return file
  }

  let _showProgressBar = (div) => {
    let _div = document.getElementById(div);
   _div.classList.remove("hide");
  }

 let _closeProgressBar = (div) => {
   let _div = document.getElementById(div);
  _div.classList.add("hide");
 }

  let _slingShotUploadConfigure = (event , template , folder ,div) => {
      let _upload = new Slingshot.Upload(folder);
      let _file = _collectfile(event , template);
      _showProgressBar(div);
      _upload.send(_file , (error , downloadUrl) => {
     template.uploader.set();
      if (error){
        //throw new Meteor.Error('500' , error.reason);
        event.target.value = '';
        sAlert.error(error.reason , {effect: 'bouncyflip',
        position: 'bottom-right', timeout: 3000, onRouteClose: false, stack: false, offset: '150px'});
        _closeProgressBar(div);
     }
     else{
       sAlert.success('File was uploaded successfully' , {effect: 'genie',
       position: 'bottom-right', timeout: 3000, onRouteClose: false, stack: false, offset: '150px'});
       event.target.value = '';
       template.downloadUrl.set(downloadUrl);
       _closeProgressBar(div);
       //return downloadUrl;
     }
 });
 template.uploader.set(_upload);

}

 export default function(event , template , folder ,div , progress){
   return _slingShotUploadConfigure(event , template , folder,div , progress)
 }

然后我将模块导入为 studentFileUpload from '../../modules/handle-fileuploads'; 下面是用于上传的流星弹弓代码

   Slingshot.createDirective("submitTeamTermPaper", Slingshot.S3Storage, {
     bucket: Meteor.settings.BucketName,
     AWSAccessKeyId : Meteor.settings.AWSAccessKeyId,
     AWSSecretAccessKey : Meteor.settings.AWSSecretAccessKey,
     acl: "public-read",

     authorize: function () {
     // do some validation
     // e.g. deny uploads if user is not logged in.
       if (this.userId) {
         return true;
     }
   },

   key: function (file) {
   //file here is the file to be uploaded how do i get the modified file name i defined in the client as newFilename here
   let timeStamp = + new Date;
//let newFilename = file.name.replace(/_/g , "-");
return  'Team_Term_Papers/' + timeStamp + '_' + '_' + newFilename;

} }); 从我的代码 newFilename 是保存修改后的文件名的变量。我如何从服务器环境访问它。非常感谢任何帮助。谢谢

您可以使用元上下文将额外信息传递给弹弓:

metacontext = {newName: "foo"};
let _upload = new Slingshot.Upload(folder,metacontext);

然后您可以在 key 函数中访问该元上下文:

key: function (file,metacontext) {
  let timeStamp = + new Date;
  let newFilename = metacontext ? metacontext.newName : file.name;
  newFilename = newFilename.replace(/_/g , "-");
  return  'Team_Term_Papers/' + timeStamp + '_' + '_' + newFilename;
}