使用FS和NodeJS上传文件

时间:2014-03-05 19:26:21

标签: node.js node-modules

当我尝试上传文件时出错,它在本地工作,但在我的远程服务器上无效...

我的错误:

    [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

3 个答案:

答案 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)

您可以使用强大的模块。易于使用

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