0

当我尝试上传文件时出现错误,它在本地工作,但在我的远程服务器上不起作用......

我的错误:

    [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
4

3 回答 3

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()...)。

于 2014-03-05T20:28:54.813 回答
0

你可以使用强大的模块。便于使用

https://www.npmjs.org/package/formidable

于 2014-03-05T23:30:02.483 回答
0

所以这个:var file = './public/images/photo/'+file_name;是一个基于process.cwd(). 大概如果您的服务器进程是使用您的应用程序 repo root 作为 cwd 启动的,那么一切都应该很好,但可能情况并非如此。不依赖于cwd但使用__dirname和构造相对于当前javascript文件位置的路径更加健壮。所以试一试,看看它是否能解决它。您可以通过以下方式确认一种或另一种方式:console.log(process.cwd())在您的控制器模块中进行调试。

于 2014-03-05T19:40:57.840 回答