简而言之,我需要重命名通过Angular和Node上传的文件,并使这个新名称可用于后端和前端(我认为)。这样做的最佳做法是什么?
我在Angularjs应用中使用文件上传插件(https://github.com/danialfarid/angular-file-upload)。上传命中Nodejs处理的路由,然后上传文件,成功时,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()
方法中重命名该文件(只是一个硬编码示例...我实际上会考虑文件类型和现有名称加上随机字符串或帐户标识符):
var renamedPath = path.resolve("./public/fileupload/userphotos/" + "abc123.jpg");
fs.rename(newPath, renamedPath);
但是当我将文件信息保存到用户的帐户中时,我没有可用的新名称。我想我可以在成功回调中将其传回去?这是最好的方式还是我错过了什么?
答案 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()
中,我需要进行一项重要更改,将json
与send
交换(否则我会在值中添加引号)< / p>
//res.json('success');
res.send(renamedFile);
然后我可以在Angular成功处理程序中访问此名称作为data
值。