首页 文章

修改从loopback-component-storage获取的映像

提问于
浏览
12

我正在使用 loopback 将图像存储到 server .

我想在保存到服务器之前 modify 文件的 file name .

另外我想在保存之前将其转换为另一个缩略图形式 .

这就是我的表现 .

在客户端

Upload.upload(
{
    url: '/api/containers/container_name/upload',
    file: file,
    fileName: "demoImage.jpg",
    //Additional data with file
    params:{
     orderId: 1, 
     customerId: 1
    }
});

在服务器端我收到查询“params”但没有得到“文件名”

我的存储型号名称是 container

Container.beforeRemote('upload', function(ctx,  modelInstance, next) {

    //OUPTUTS: {orderId:1, customerId:1]}
    console.log(ctx.req.query);

    //Now I want to change the File Name of the file.
    //But not getting how to do that

    next();
})

How to change the File name of the File getting saved at the server?

2 回答

  • 23

    我想到了 .

    我们必须在 boot/configure-storage.js 中定义自定义函数 getFileName .

    假设我的 datasource for loopback-component-storagepresImage .

    server / boot / configure-storage.js

    module.exports = function(app) {
        //Function for checking the file type..
        app.dataSources.presImage.connector.getFilename = function(file, req, res) {
    
            //First checking the file type..
            var pattern = /^image\/.+$/;
            var value = pattern.test(file.type);
            if(value ){
                var fileExtension = file.name.split('.').pop();
                var container = file.container;
                var time = new Date().getTime();
                var query = req.query;
                var customerId = query.customerId;
                var orderId    = query.orderId;
    
                //Now preparing the file name..
                //customerId_time_orderId.extension
                var NewFileName = '' + customerId + '_' + time + '_' + orderId + '.' + fileExtension; 
    
                //And the file name will be saved as defined..
                return NewFileName;
            }
            else{
                throw "FileTypeError: Only File of Image type is accepted.";
            }
        };
    }
    

    common / models / container.js

    现在假设我的容器模型是 container .

    module.exports = function(Container) {
        Container.afterRemote('upload', function(ctx,  modelInstance, next) {
          var files = ctx.result.result.files.file;
    
          for(var i=0; i<files.length; i++){
            var ModifiedfileName = files[i].name;
            console.log(ModifiedfileName) //outputs the modified file name.
          } //for loop
          next();
        }); //afterRemote..
    };
    

    现在将它的图像转换为 Thumbnail size

    下载quickthumb

    以下是如何将其与环回一起使用 .

    此代码直接从Loopback thumbnail view复制

    common / models / container.js

    module.exports = function(Container) {
    
        var qt = require('quickthumb');
    
        Container.afterRemote('upload', function(ctx, res, next) {
    
            var file = res.result.files.file[0];
            var file_path = "./server/storage/" + file.container + "/" + file.name;
            var file_thumb_path = "./server/storage/" + file.container + "/thumb/" + file.name;
    
            qt.convert({
                src: file_path,
                dst: file_thumb_path,
                width: 100
            }, function (err, path) {
    
            });
    
            next();
        });
    
    };
    
  • 0

    抄袭上面的答案,这个configure-storage允许通过 req.params.filename 显式设置文件名,如果没有提供,则默认为现有名称 .

    configure-storage.js

    module.exports = function(app) {
    
    //Function for checking the file type..
        app.dataSources.storage.connector.getFilename = function(file, req, ignoreRes) {
    
            if (!req.params.filename) {
                return file.name
            }
    
            var fileExtension = file.name.split('.').pop()
            return req.params.filename + '.' + fileExtension
    
        };
    }
    

相关问题