重命名通过Angularjs上传的文件

时间:2014-03-15 20:48:53

标签: javascript node.js angularjs file-upload

简而言之,我需要重命名通过Angular和Node上传的文件,并使这个新名称可用于后端和前端(我认为)。这样做的最佳做法是什么?

我在Angularjs应用中使用文件上传插件(https://github.com/danialfarid/angular-file-upload)。上传命中Nodejs处理的路由,然后上传文件,成功时,angular将文件名保存到用户帐户。但是,如果两个人上传了同名文件,则会发生冲突,因此我需要重命名每个文件(可能是通过添加日期和时间)。

我的代码如下:

  1. Angular处理上传,点击节点可以使用的路径。
  2. 节点将文件移动到位。
  3. 成功时,angular将文件名保存到用户的帐户中。
  4. 看来我无法在上传之前重命名该文件。如果我在移动到位后通过节点重命名该文件,我遇到了需要将新名称恢复为angular以保存到数据库中的问题。不确定采用这一过程的最佳方法。

    这是我当前的文件上传代码(工作正常,只是不重命名文件):

    在Angular ......

       $scope.onFileSelect = function ($file) {
            var photo = $file[0];
            $scope.upload = $upload.upload({
                url: '/upload/userphoto',
                headers: {'Content-Type': photo.type},
                file: photo,
                method: 'POST'
            }).progress(function (evt) {
                //removed for brevity
            }).success(function (data, status, headers, config) {
                User.currentUser.user_profile_image = photo.name;
                User.updateUser();
            }).error(function (err) { 
                //removed for brevity 
            });
        };
    

    后期路由/upload/userphoto在节点中与:

    匹配
    exports.uploadProfilePhoto = function(req, res) {
        var callbacks = {};
    
        callbacks.uploadSuccess = function(){
            res.json('success');
        };
    
        callbacks.uploadFailure = function(err){
            //removed for brevity
        };
    
        user.handleUserImageUpload(req.files, callbacks);
    };
    

    设置一些回调,然后点击handleUserImageUpload(),即:

    this.handleUserImageUpload = function(params, callbacks) {
        fs.readFile(params.file.path, function(err, data){
            if(err){
                callbacks.uploadFailure(err);
            }
            var newPath = path.resolve("./public/fileupload/userphotos/" + params.file.filename);
            fs.writeFile(newPath, data, function(err) {
                if(err){
                    callbacks.uploadFailure(err);
                }
                callbacks.uploadSuccess();
            });
        });
    };
    

    假设成功,请将我们带回上面第一部分Angular代码的成功处理程序。我知道我可以使用handleUserImageUpload()方法在fs.rename()方法中重命名该文件(只是一个硬编码示例...我实际上会考虑文件类型和现有名称加上随机字符串或帐户标识符):

    var renamedPath = path.resolve("./public/fileupload/userphotos/" + "abc123.jpg");
    fs.rename(newPath, renamedPath);
    

    但是当我将文件信息保存到用户的帐户中时,我没有可用的新名称。我想我可以在成功回调中将其传回去?这是最好的方式还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

解决方案原来是我怀疑的......传递回调中的值。所以我将以下内容添加到handleUserImageUpload() ...

// grab the extension
var fileExtension = '.' + params.file.filename.split('.').pop();

// rename the file with a sufficiently random value and add the file extension back
var renamedFile =  Math.random().toString(36).substring(7) + new Date().getTime() + fileExtension;

//set up the new path for use in fs.rename()
var renamedPath = path.resolve("./public/fileupload/userphotos/" + renamedFile);

// Make it so
fs.rename(newPath, renamedPath);

// pass the new name to the callback
callbacks.uploadSuccess(renamedFile);

在创建回调的函数uploadProfilePhoto()中,我需要进行一项重要更改,将jsonsend交换(否则我会在值中添加引号)< / p>

//res.json('success');
res.send(renamedFile);

然后我可以在Angular成功处理程序中访问此名称作为data值。