在Node.js中,我们可以使用formidable模块来轻松地实现文件上传功能,代码如下:

var Q = require('q');
var util = require('util');
var fs = require('fs');
var path = require('path');
var moment = require('moment');
var formidable = require('formidable'); var imageUpload = function (){
}; imageUpload.prototype.useFormParseCallback = function(req){
var deferred = Q.defer(); var form = new formidable.IncomingForm();
form.parse(req, deferred.makeNodeResolver());
return deferred.promise;
}; // 确保目录存在
// 如果指定的目录不存在则同步创建(多层次)
imageUpload.prototype.ensureUploadPathExist = function(uploadPath, mode){
if (!fs.existsSync(uploadPath)){
var pathtmp;
uploadPath.split(path.sep).forEach(function(dirname) {
if (pathtmp) {
pathtmp = path.join(pathtmp, dirname);
}
else {
pathtmp = dirname;
}
if (!fs.existsSync(pathtmp)) {
if (!fs.mkdirSync(pathtmp, mode)) {
return false;
}
}
});
} return true;
}; imageUpload.prototype.uploadImage = function(req){
var pathName = '/uploadImgs/';
var uploadPath = path.join(__dirname, '../../public', pathName); this.ensureUploadPathExist(uploadPath); return this.useFormParseCallback(req).then(function(files){
var file = files[1].imagefile;
var fileType = file.type.split('/')[1];
var newFileName = 'upload_' + moment().format('x') + Math.random().toString().substr(2, 10) + '.' + fileType;
fs.renameSync(file.path, uploadPath + newFileName);
return pathName + newFileName;
});
}; module.exports = imageUpload;

  上述代码中使用了模块q来处理Node.js中的回调处理,有关如何使用q可以自己上百度搜索下,这里不再赘述。函数ensureUploadPathExist()可以确保上传文件的目标目录是存在的,如果不存在它会逐级创建。文件被上传在/public/uploadImgs/目录下,并且按照指定的格式进行了重命名以防止文件被覆盖,有问题的地方在fs.renameSync()函数的调用。正常情况下如果上传的目录在本地,执行fs.renameSync()函数重命名文件是不会有问题的,但如果是跨分区重命名,例如在Linux中使用了NFS或者共享目录,则此处会报跨分区重命名的权限错误。解决办法是将fs.renameSync()函数替换为下面的代码:

var readStream = fs.createReadStream(file.path);
var writeStream = fs.createWriteStream(uploadPath + newFileName); var deferred = Q.defer();
util.pump(readStream, writeStream, deferred.makeNodeResolver());
return deferred.promise.then(function() {
fs.unlinkSync(file.path);
return pathName + newFileName;
});

  使用上述代码既可以实现本地文件的上传,也可以实现跨分区的文件上传。

Node.js使用fs.renameSync报cross-device link not permitted错误的更多相关文章

  1. 解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)

    2014-08-23 今天开始学习Node.js,在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错代码所在如下: function upload(response,reques ...

  2. Node.js用fs.renameSync报cross-device link not permitted错

    转自: http://blog.csdn.net/starrexstar/article/details/8048722 今天把 Manuel Kiessling 的[The Node Beginne ...

  3. node.js的fs核心模块读写文件操作 -----由浅入深

    node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFil ...

  4. nodejs(四)file System模块 解决Cross device link错误 EXDEV

    var fs = require('fs'); /*cross device link fs.rename('c:\\err.LOG','d:\\err.LOG',function(err){ con ...

  5. [node.js] fs.renameSync()报错

    初学node.js,跟着node入门,操作了一遍.在最后一步,上传图片并显示时遇到报错 fs.js: throw err; ^ Error: ENOENT: no such file or direc ...

  6. Node.js:fs文件系统模块

    fs文件系统模块,这是一个非常重要的模块,对文件的操作都基于它.该模块的所有方法都有同步和异步两种方式,下面便介绍一下该模块的使用. 1.检测当前进程对文件的权限 使用fs.access(path[, ...

  7. node.js中fs文件系统模块的使用

    node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法 ...

  8. 关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施

    背景说明 最近在工作项目中有下面一个场景: 使用Node.js的express框架实现了一个文件系统服务器端,其中有个API用于客户端上传文件.客户端使用Node.js的HttpClient来调用服务 ...

  9. #Node.js的fs导入遇到的问题和解决方案

    一直在使用VS Code,今天打算用Node.js进行文件IO时候遇到了一些问题,fs是Node.js的核心功能之一,一开始我用Javascript编写fs模块的导入. var fs = requir ...

随机推荐

  1. 清空StringBuilder的三种方法及效率

    清空StringBuilder的三种方法及效率 大家知道对于字符串频繁拼接是使用stringbuilder.Append方法比使用string+=方法效率高很多,但有时需要清空stringbuilde ...

  2. DbExpressionBinding requires an input expression with a collection ResultType. 参数名: input

    使用linq多表连接遇到的问题: 解决方案:注释为出错代码,更改使用GroupBy解决问题 context.ERG_TipOffsInfo.GroupBy(x => x.Data,(Data,C ...

  3. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  4. 写了一个基于React+Redux的仿Github进度条

    曾经实现过Angular版,这次感觉用了高大上的React却写了更多的代码,需要的配置也更多了,有利有弊吧. 但这个“导航条问题”很有意思,涉及到在Redux中写timer,其实我很困惑,到底如何完美 ...

  5. 数据导出Excel中文乱码

    数据导出到EXCEL提供用户下载,当记录数大于5行时不会出现乱码.但只要不退出Excel,再删除除记录,当记录数小于5行时,导出也不会出现乱码.当然一旦退出Excel再导出就会出现乱码了. 可以试试 ...

  6. Encapsulation、Inheritance、Polymorphism

    public class SoldierDemo { public static void main(String[] args) { /*Soldier test1=new Army("张 ...

  7. Taylor定理证明

    下图,单独打开查看 当n->inf时如果 Rn(c)趋0, c属于(a,x), 那么在区间(a,x) 内函数在a点生成的taylor级数收敛到函数f.

  8. PHPstudy 无法启动Apache

    今天打安装完phpstudy的时候,启动Apache发现端口被占用,这个端口也就是system端口.如果想要启动服务器必须关掉这个,但是会导致系统无法正常显示. 后来我就在网上搜各种办法,依然没成功. ...

  9. Win7下硬盘安装Linux双系统

    Win7下硬盘安装CentOS6.2 一.准备工作:划出磁盘空闲空间和准备安装文件  参考文献: [Win7下硬盘安装Linux总结(CentOS)]来源:Linux社区  作者:lixianlin ...

  10. html 页面中显示单行省略号

    <!DOCTYPE html>   <html>   <head>   <meta charset="UTF-8">   <t ...