当我尝试上传文件时出错,它在本地工作,但在我的远程服务器上无效...
我的错误:
[sbaf.fr.3005-53 (out) 2014-03-05T20:19:59] { [Error: ENOENT, rename '/tmp/1e426309d298d9ab1d099e1017584058']
[sbaf.fr.3005-53 (out) 2014-03-05T20:19:59] errno: 34,
[sbaf.fr.3005-53 (out) 2014-03-05T20:19:59] code: 'ENOENT',
[sbaf.fr.3005-53 (out) 2014-03-05T20:19:59] path: '/tmp/1e426309d298d9ab1d099e1017584058' }
我的控制器:
photoDAL.prototype.save = function(photo, file, callback) {
photo.file = file.name;
var photo = dbContext.photo.build(photo);
var file_tmp = file.path;
var file_name = file.name;
var file_type = file.type;
var file = './public/images/photo/'+file_name;
fs.rename(file_tmp, file, function(err){
if( err ) console.log(err);
});
photo.save().success(function(photo) {
callback(photo);
}).error(function(error) {
callback({message: error});
});
};
编辑#1:
我的ExpressJS应用程序的屏幕截图...
屏幕截图1:http://glui.me/?i=eweyq4ovennej50/2014-03-05_at_20.34_2x.png/ 屏幕截图2:http://glui.me/?i=1n2cjv57jd2fmwq/2014-03-05_at_20.33_2x.png/
编辑#2:
我的代码:
console.log(process.cwd());
console.log(__dirname);
控制台:
[sbaf.fr.3005-71 (out) 2014-03-05T21:55:48] /home/anthoc/apps
[sbaf.fr.3005-71 (out) 2014-03-05T21:55:48] /home/anthoc/apps/sbaf.fr/app/dal
答案 0 :(得分:0)
所以:var file = './public/images/photo/'+file_name;
是基于process.cwd()
的相对路径。假设你的服务器进程是以你的app repo root作为cwd启动的,那么一切都应该没问题,但可能情况并非如此。不依赖cwd
但使用__dirname
并构造相对于当前javascript文件位置的路径更加健壮。所以试一试,看看它是否修复了它。您可以使用控制器模块中的console.log(process.cwd())
以这种或那种方式进行确认以进行调试。
答案 1 :(得分:0)
您可以尝试使用__dirname
。我将如何做到这一点:
photoDAL.prototype.save = function(photo, file, callback) {
photo.file = file.name;
var photo = dbContext.photo.build(photo);
var file_tmp = file.path;
var file_name = file.name;
var file_type = file.type;
var file = __dirname + '/public/images/photo/'+file_name;
fs.rename(file_tmp, file, function(err){
if( err ) console.log(err);
});
photo.save().success(function(photo) {
callback(photo);
}).error(function(error) {
callback({message: error});
});
};
现在,如果您的代码位于文件夹中且您的目标位于父级,就像我一样:
-root
- public
-photos
-server
-upload.js
您可以向字符串proto添加一个函数。
String.prototype.getParent = function () {
// Be cross-platform
var replaced = this.replace(new RegExp("\\\\", "g"), '/');
var index = replaced.lastIndexOf('/');
return replaced.substring(0, index);
};
现在根据需要多次致电__dirname.getParent()
(__dirname.getParent().getParent()...
)。
答案 2 :(得分:0)
您可以使用强大的模块。易于使用