gpt4 book ai didi

javascript - 使用带 Sails.js v0.10 的 Skipper 上传文件 - 如何检索新文件名

转载 作者:搜寻专家 更新时间:2023-11-01 04:50:20 31 4
gpt4 key购买 nike

我正在升级到 Sails.js 版本 0.10,现在需要使用 Skipper管理我的文件上传。

当我上传一个文件时,我会使用 UUID 为其生成一个新名称,并将其保存在 public/files/文件夹中(这将在我完成所有工作后更改,但它现在适合测试)

我将原始名称和上传的名称+路径保存到Mongo数据库中。

这在 Sails v0.9.x 下非常简单,但是使用 Skipper 我不知道如何读取新文件名和路径。 (显然,如果我能读取名称,我就可以构建路径,所以它实际上只是我需要的名称)

我的 Controller 看起来像这样

var uuid = require('node-uuid'),
path = require('path'),
blobAdapter = require('skipper-disk');

module.exports = {

upload: function(req, res) {

var receiver = blobAdapter().receive({
dirname: sails.config.appPath + "/public/files/",
saveAs: function(file) {
var filename = file.filename,
newName = uuid.v4() + path.extname(filename);
return newName;
}
}),
results = [];

req.file('docs').upload(receiver, function (err, files) {
if (err) return res.serverError(err);
async.forEach(files, function(file, next) {
Document.create({
name: file.filename,
size: file.size,
localName: // ***** how do I get the `saveAs()` value from the uploaded file *****,
path: // *** and likewise how do i get the path ******
}).exec(function(err, savedFile){
if (err) {
next(err);
} else {
results.push({
id: savedFile.id,
url: '/files/' + savedFile.localName
});
next();
}
});
}, function(err){
if (err) {
sails.log.error('caught error', err);
return res.serverError({error: err});
} else {
return res.json({ files: results });
}
});
});
},

_config: {}

};

我该怎么做?

最佳答案

我现在已经解决了这个问题,并认为我会分享我的解决方案,以造福于其他正在努力解决类似问题的人。

解决方案是完全不使用skipper-disk,而是编写我自己的自定义receiver。我将其创建为 Sails Service 对象。

所以在文件 api/services/Uploader.js

// Uploader utilities and helper methods
// designed to be relatively generic.

var fs = require('fs'),
Writable = require('stream').Writable;

exports.documentReceiverStream = function(options) {
var defaults = {
dirname: '/dev/null',
saveAs: function(file){
return file.filename;
},
completed: function(file, done){
done();
}
};

// I don't have access to jQuery here so this is the simplest way I
// could think of to merge the options.
opts = defaults;
if (options.dirname) opts.dirname = options.dirname;
if (options.saveAs) opts.saveAs = options.saveAs;
if (options.completed) opts.completed = options.completed;

var documentReceiver = Writable({objectMode: true});

// This `_write` method is invoked each time a new file is received
// from the Readable stream (Upstream) which is pumping filestreams
// into this receiver. (filename === `file.filename`).
documentReceiver._write = function onFile(file, encoding, done) {
var newFilename = opts.saveAs(file),
fileSavePath = opts.dirname + newFilename,
outputs = fs.createWriteStream(fileSavePath, encoding);
file.pipe(outputs);

// Garbage-collect the bytes that were already written for this file.
// (called when a read or write error occurs)
function gc(err) {
sails.log.debug("Garbage collecting file '" + file.filename + "' located at '" + fileSavePath + "'");

fs.unlink(fileSavePath, function (gcErr) {
if (gcErr) {
return done([err].concat([gcErr]));
} else {
return done(err);
}
});
};

file.on('error', function (err) {
sails.log.error('READ error on file ' + file.filename, '::', err);
});

outputs.on('error', function failedToWriteFile (err) {
sails.log.error('failed to write file', file.filename, 'with encoding', encoding, ': done =', done);
gc(err);
});

outputs.on('finish', function successfullyWroteFile () {
sails.log.debug("file uploaded")
opts.completed({
name: file.filename,
size: file.size,
localName: newFilename,
path: fileSavePath
}, done);
});
};

return documentReceiver;
}

然后我的 controller 就变成了(在 api/controllers/DocumentController.js 中)

var uuid = require('node-uuid'),
path = require('path');

module.exports = {

upload: function(req, res) {

var results = [],
streamOptions = {
dirname: sails.config.appPath + "/public/files/",
saveAs: function(file) {
var filename = file.filename,
newName = uuid.v4() + path.extname(filename);
return newName;
},
completed: function(fileData, next) {
Document.create(fileData).exec(function(err, savedFile){
if (err) {
next(err);
} else {
results.push({
id: savedFile.id,
url: '/files/' + savedFile.localName
});
next();
}
});
}
};

req.file('docs').upload(Uploader.documentReceiverStream(streamOptions),
function (err, files) {
if (err) return res.serverError(err);

res.json({
message: files.length + ' file(s) uploaded successfully!',
files: results
});
}
);
},

_config: {}
};

我确信它可以进一步改进,但这对我来说非常适合。

关于javascript - 使用带 Sails.js v0.10 的 Skipper 上传文件 - 如何检索新文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23977005/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com