我正在使用SailsJS(测试版).我试图找到一种方法来使用graphicsmagick在SailsJS-beta中使用Skipper解析的流来调整Skipper函数之前调整图像大小req.file('inputName').upload().
我的目标是拍摄我原始的大图像,并在上传之前调整大小.Sails beta引入了Skipper文件解析器,这些解析器文档很少(至少我不理解它).请帮我了解如何在上传前调整图片大小.
这工作(我的控制器动作中的代码):
req.file('fileName').upload('storedImage.png', function(err, files){
// File is now uploaded to storedImage.png
});
Run Code Online (Sandbox Code Playgroud)
我想要的是:
// Read the file stream into a file upload
var stream = req.file('fileName');
gm(stream).resize(200, 200).write('storedImage.png', function(err){
// File is now resized to 200x200 px and uploaded to storedImage.png
});
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何正确获取流req.file('fileName')以将其发送到gm?
作为标题,现在我无法在上传之前检查文件类型.我只验证并且在文件上传成功后不允许保存数据.以下是基本代码
updateAvatar : function(data, context, req, res) {
req.file('avatar').upload({
dirname: '../../assets/images/avatar'
}, function (err, files) {
var allowExts = ['image/png', 'image/gif', 'image/jpeg'];
if (err)
return res.serverError(err);
if (files.length === 0)
return res.badRequest('No file was uploaded!');
if (allowExts.indexOf(files[0].type) == -1)
return res.badRequest('File type is not supported!');
// save database here
});
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做正确的代码?对不起,我的英语不好!非常感谢!
我想使用skipper上传一个简单的文件.早些时候,可以使用req.files访问通过表单上传的文件,但是在Sails 0.10.x中,默认情况下安装了skipper,req.files是未定义的.而不是使用req.file('filename')来访问该文件.
我可以通过简单的文件上传来查看文档.但是,我希望能够在上传之前访问文件名,并且还需要
我如何使用skipper模块执行此操作,或者更有效的方法是什么?
编辑
到目前为止,我已经能够做到这一点,但我希望必须有一个更好的方法.
为了访问文件名,我使用了这个表达式
var inputFileName = req.file('inputFile')._files[0]["stream"]["filename"];
Run Code Online (Sandbox Code Playgroud)
我可以看到,如果目录不存在,则会根据上传参数中给出的文件路径和名称自动创建目录
我正在使用skipper将多个文件一次上传到本地文件夹.但我遇到了一些问题.
upload: function (req, res) {
if (_.isEmpty(req.session.User)){
return res.json({ //---> 1
success: 0
});
}else{
res.setTimeout(0);
var MAXBYTES = 10*1000*1000;
//---> 2
if (req._fileparser.form.bytesExpected > MAXBYTES){
return res.json({
success: 0,
error: 'File size limit exceeded.'
});
}else{
req.file('file[]').on('progress', function(event){
return event; //---> 3
}).upload({
maxBytes: MAXBYTES
}, function whenDone(err, uploadedFiles) {
//---> 4
return res.json({
success: 1,
});
});
}
}
},
Run Code Online (Sandbox Code Playgroud)
第一个错误//---> 1如果用户未登录,我想结束此上传过程并返回success = 0.这不起作用.在客户端,请求保持挂起而没有任何响应.
第二个错误//---> 2我之前遇到了一个错误,如https://github.com/balderdashy/skipper/issues/36所述,所以作为一个快速修复,我使用了github评论中使用的人.但同样在问题1中,我遇到了这个问题.如果文件大小超过MAXBYTES,我想结束这个上传过程并将success = 0返回给用户.不会回到客户端.
第三个错误//---> 3 …
我使用船长和船长一次上传多个文件,如果我上传少量文件,一次说20到30每件事情都可以,但如果我上传更多文件,如200或300,我开始接收以下内容某些文件的错误,即只有两个或三个文件而不是所有文件.
上游在插入接收器之前超时
在sails> node_modules> skipper> Standalone> Upstream> Upstream.js文件中有一个属性maxTimeToBuffer,它的默认值是4500当我将其更改为10000我的代码工作正常我测试了100多次.
我的问题是
提前感谢你们的任何帮助
我有一个表单,您可以上传文件.我直接用船长上传文件,效果很好.
req.file('file').upload({
adapter: require('skipper-s3'),
key: 'key',
secret: 'secret',
bucket: 'bucketname'
}, function (err, uploadedFiles) {
if (err){
// ko
}
else{
// ok
}
});
Run Code Online (Sandbox Code Playgroud)
但我想首先调整大小然后上传文件,所以:
sharp(original).resize(800).quality(90).toBuffer(function(err, outputBuffer) {
if (err) {
// ko
}
// ok
outputBuffer;
});
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:如何上传outputBuffer而不是req.file('file')?
我的sails应用程序中有多个文件上传的问题.我试图用Dropzone.js实现多个文件上传,我的后端是Sails v0.10.0-rc8.
现在,当我通过dropzone上传一些文件时,我发现在多次上传的情况下,它会在请求中发送带有单独params的文件.参数名称是'photo[0]', 'photo[1]', 'photo[2]',....我在控制器中获取这样的文件:
req.file(file).upload(function (err, files) {
// save the file
});
Run Code Online (Sandbox Code Playgroud)
但是当提交的文件超过一个时,请求将被传递给控制器,然后从请求中解析并存储所有文件,因此我的控制器中只有一个文件.
有没有人遇到过这个问题?也许在船长体解析器中不支持多个文件上传和不同的请求参数?因为当我在一个属性('photo')中提交多个文件时,所有这些文件都会被处理并传递给控制器.
参考:https : //github.com/balderdashy/skipper/issues/49
适配器:skipper-gridfs
基本控制器代码:
req.file('fileTest')
.upload({
// You can apply a file upload limit (in bytes)
maxBytes: maxUpload,
adapter: require('skipper-gridfs'),
uri: bucketConnect,
saveAs : function (__newFileStream,cb) {
cb(null, __newFileStream.filename);
}
}, function whenDone(err, uploadedFiles) {
if (err) {
var error = { "status": 500, "error" : err };
return res.serverError(error);
}else {
Run Code Online (Sandbox Code Playgroud)
我有一个jQuery-File-Upload客户端(https://blueimp.github.io/jQuery-File-Upload/),通过使用此处描述的jqXHR中止来实现“取消”过程(https://github.com/blueimp/ jQuery-File-Upload / wiki / API):
$('button.cancel').click(function (e) {
jqXHR.abort();
});
Run Code Online (Sandbox Code Playgroud)
客户端中止后,服务器崩溃并显示以下消息:
events.js:72
throw er; // Unhandled 'error' event
^
Error: Request …Run Code Online (Sandbox Code Playgroud) 我正在升级到Sails.js版本0.10,现在需要使用Skipper来管理我的文件上传.
当我上传文件时,我使用UUID为它生成一个新名称,并将其保存在public/files /文件夹中(当我将这一切全部工作时会改变,但现在测试很好)
我将原始名称和上传的名称+路径保存到Mongo数据库中.
这一切都非常简单,Sails v0.9.x但使用Skipper我无法弄清楚如何读取新的文件名和路径.(显然,如果我能读到我可以构建路径的名称,那么它实际上只是我需要的名称)
我的控制器看起来像这样
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: // ***** …Run Code Online (Sandbox Code Playgroud) 我正在使用skipper-s3上传文件。我发现上传到S3的所有文件都已默认设置为ACL:private和。Content-Type:binary/octet-stream我想知道是否可以在上传到 S3 之前设置这些参数。
也许是这样的:
req.file('image').upload({
adapter: require('skipper-s3'),
key: KEY,
secret: SECRET,
bucket: BUCKET_NAME,
headers: {
ContentType: 'image/png',
ACL: 'public-read'
}
}
Run Code Online (Sandbox Code Playgroud)
我已阅读该问题,但仍然没有答案。另外,有什么办法可以获取Content-Type客户端发送来的文件吗?
更新:该问题已关闭。看来这是一个 knox-mpu 问题。
我目前正在我的应用程序中创建一个文件上传系统.我的后端是Sails.js(10.4),它作为我单独的前端(Angular)的API.
我选择将我上传的文件存储到我的MongoDB实例,并使用sails的内置文件上传模块Skipper.我正在使用适配器skipper-gridfs(https://github.com/willhuang85/skipper-gridfs)将文件上传到mongo.
现在,上传文件本身不是问题:我在我的客户端上使用dropzone.js,它将上传的文件发送到/ api/v1/files/upload.文件将上传.
为了实现这一点,我在FileController中使用以下代码:
module.exports = {
upload: function(req, res) {
req.file('uploadfile').upload({
// ...any other options here...
adapter: require('skipper-gridfs'),
uri: 'mongodb://localhost:27017/db_name.files'
}, function(err, files) {
if (err) {
return res.serverError(err);
}
console.log('', files);
return res.json({
message: files.length + ' file(s) uploaded successfully!',
files: files
});
});
}
};
Run Code Online (Sandbox Code Playgroud)
现在问题是:我想在上传文件之前先处理这些文件.特别是两件事:
我不知道从哪里开始或如何实现这种功能.所以任何帮助将不胜感激!
目前我正在使用SailsJS创建自己的网络应用程序.我正在使用skipper-s3将文件上传到AWS S3.这是我的代码:
req.file('uploadFile').upload({
adapter: require('skipper-s3'),
key: 'KEY',
secret: 'SECRET',
bucket: 'BUCKET',
ACL: 'public-read'
}, function whenDone(err, filesUploaded) {
if (err) {
console.log(err);
return res.negotiate(err);
}
var pt = {
user: req.session.User.id,
agency: req.param('id'),
path: filesUploaded[0].extra.Location,
filename: filesUploaded[0].filename
};
Transaction.create(pt, function TransactionCreated(err, trans){
if(err) return next(err);
return res.ok({
files: filesUploaded,
textParams: req.params.all(),
trans: trans
});
})
});
Run Code Online (Sandbox Code Playgroud)
所以我已经将'path'和'original filename'放到了MongoDB中.但S3中的'文件名'已经用'随机名'改变了.那么,上传时是否可以更改为"原始文件名"?当用户想要下载时,OR会自动更改为"原始文件名"吗?
此致,John Elmer Semaya
我在sails.js 应用程序中有一个文件上传系统。我想在将上传内容保存到服务器之前对其进行处理。我在客户端的表单允许多个文件上传。现在在服务器端我怎么知道发送了多少文件?
例如,我可以使用以下命令从上传中找到预期的总字节数:
req._fileparser.form.bytesExpected
Run Code Online (Sandbox Code Playgroud)
但是,我找不到类似的东西来帮助我找到发送到服务器的文件总数。
还有上面的代码req._fileparser.form.bytesExpected,有没有更好的方法来获取客户端通过上传表单发送的文件的总组合文件大小?
sails.js ×13
skipper ×13
file-upload ×5
node.js ×5
javascript ×3
amazon-s3 ×1
bluebird ×1
dropzone.js ×1
express ×1
gridfs ×1
image ×1
mongodb ×1