Javascript Expressjs:enoint在上载图像时
我已经编写了一些用于上传化身的中间件,如下所示:Javascript Expressjs:enoint在上载图像时,javascript,node.js,file-upload,express,Javascript,Node.js,File Upload,Express,我已经编写了一些用于上传化身的中间件,如下所示: var gm = require('gm'), mkdirp = require('mkdirp'), fs = require('fs'); uploadAvatar = function(req, res, next) { var img, path, user; if (req.files.avatar_image) { user = req.user; img = req.files.avatar
var gm = require('gm'),
mkdirp = require('mkdirp'),
fs = require('fs');
uploadAvatar = function(req, res, next) {
var img, path, user;
if (req.files.avatar_image) {
user = req.user;
img = req.files.avatar_image;
path = __dirname + "/../../public/avatar/" + (user.name.parameterize()) + ".png";
mkdirp.sync(__dirname + "/../../public/avatar/");
fs.createReadStream(img.path).pipe(fs.createWriteStream(path));
gm(path).resize(250, 250).autoOrient().quality(90).write(path, function(err) {
if (err != null) {
req.flash('error', err);
} else {
user.avatar = "/avatar/" + (user.name.parameterize()) + ".png";
user.save(function(err) {
if (err != null) {
req.flash('error', err);
}
next();
});
}
});
} else {
next();
}
};
// Usage
app.post('/upload', ensureAuthenticated, uploadAvatar, handleUpload);
当我现在尝试上载图像时,节点
崩溃,出现了非常有用的错误消息:
events.js:72
throw er; // Unhandled 'error' event
^
Error: ENOENT, open '/tmp/1126846a248af5c584770b07de649f9b.png'
在使用gm
之前,我也尝试过复制该文件。我怀疑express在我触摸它之前就删除了该文件,作为“安全措施”
有人能帮我吗
编辑:首先将临时文件复制到您的化身目录,然后确保您拥有对化身以及临时目录和文件的权限 此外,管道化读写流不是同步操作,在初始化读句柄后,您将尝试直接管道化,这可能会导致一些问题。
您需要添加事件并等待文件被复制:
var complete = function(err) {
if (!err) {
// process your gm
} else {
console.log(err);
}
}
var read = fs.createReadStream(sourcePath);
read.on('error', function(err) {
complete(err);
});
var write = fs.createWriteStream(targetPath);
write.on('error', function(err) {
complete(err);
});
write.on('close', function() {
complete();
});
read.pipe(write);
首先,将临时文件复制到您的化身目录,然后确保您对化身以及临时目录和文件拥有权限 此外,管道化读写流不是同步操作,在初始化读句柄后,您将尝试直接管道化,这可能会导致一些问题。
您需要添加事件并等待文件被复制:
var complete = function(err) {
if (!err) {
// process your gm
} else {
console.log(err);
}
}
var read = fs.createReadStream(sourcePath);
read.on('error', function(err) {
complete(err);
});
var write = fs.createWriteStream(targetPath);
write.on('error', function(err) {
complete(err);
});
write.on('close', function() {
complete();
});
read.pipe(write);
请看我补充的要点,告诉我我做错了什么。在调整大小之前,我正在复制文件。请检查临时目录及其父目录等的权限。为了确保运行节点进程的用户有权访问临时文件夹中的文件。很抱歉,我刚刚发现临时目录不存在。不知道为什么。请看我补充的要点,告诉我我做错了什么。在调整大小之前,我正在复制文件。请检查临时目录及其父目录等的权限。为了确保运行节点进程的用户有权访问临时文件夹中的文件。很抱歉,我刚刚发现临时目录不存在。不知道为什么。