Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重命名了通过Angularjs上传的文件_Javascript_Node.js_Angularjs_File Upload - Fatal编程技术网

Javascript 重命名了通过Angularjs上传的文件

Javascript 重命名了通过Angularjs上传的文件,javascript,node.js,angularjs,file-upload,Javascript,Node.js,Angularjs,File Upload,简而言之,我需要重命名通过Angular和Node上传的文件,并使新名称可用于后端和前端(我认为)。这样做的最佳实践是什么? 我正在Angularjs应用程序中使用文件上传插件()。上传点击Nodejs处理的路由,上传文件,成功后,angular将文件名保存到用户帐户中。但是,如果两个人上传一个同名的文件,就会发生冲突,因此我需要重命名每个文件(可能需要添加日期和时间) 我的代码如下所示: Angular处理上传,点击节点可以使用的路由 节点将文件移动到位 成功后,angular将文件名保存到用

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

我正在Angularjs应用程序中使用文件上传插件()。上传点击Nodejs处理的路由,上传文件,成功后,angular将文件名保存到用户帐户中。但是,如果两个人上传一个同名的文件,就会发生冲突,因此我需要重命名每个文件(可能需要添加日期和时间)

我的代码如下所示:

  • Angular处理上传,点击节点可以使用的路由
  • 节点将文件移动到位
  • 成功后,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()
    之类的方法重命名文件(只是一个硬编码的示例…我实际上会考虑文件类型和现有名称,并添加一个随机字符串或帐户标识符):


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

    解决方案就是我所怀疑的。。。在回调中传递值。因此,我将以下内容添加到
    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()
    ,我需要做一个重要的更改,将
    json
    交换为
    send
    (否则我会在值中添加引号)

    然后,我可以在Angular success处理程序中将此名称作为
    数据
    值访问

    // 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);
    
    //res.json('success');
    res.send(renamedFile);