在下面的代码片段中,我想验证第一个异步方法中的字段.
如果它们无效,我想立即向用户返回错误.
我怎么做?
var form = new formidable.IncomingForm();
async1.series([
function (callback) {
form.parse(req);
form.on('field', function (name, val) {
// Get the fields
});
form.on('fileBegin', function (name, file) {
if (file.name !== "") {
file.path = __dirname + '/upload/' + file.name;
}
});
callback();
},
function (callback) {
form.on('file', function (name, file) {
try {
// Do something with the file using the fields retrieved from first async method
}
catch (err) {
logger.info(err);
}
});
callback();
}
], function (err) …Run Code Online (Sandbox Code Playgroud) 如何在Node中命名由Formidable解析的文件?目前我的文件保存为'7c9d182a9892bb7588b49ea9d364efd0.pdf',我更喜欢原始文件名.
有人知道怎么做吗?
我正在尝试使用aws-sdk或knox将通过表单提交的文件直接上传到Amazon S3存储桶.表格处理是强大的.
我的问题是:如何使用aws-sdk(或knox)使用这些库的最新功能处理流来正确使用强大的功能?
我知道这个主题已经在这里被提出了不同的风格,即:
但是,我认为答案有点过时和/或偏离主题(即CORS支持,我现在不希望出于各种原因使用)和/或最重要的是,没有提及最新的功能来自aws-sdk(参见:https://github.com/aws/aws-sdk-js/issues/13#issuecomment-16085442)或knox(特别是putStream()或其readableStream.pipe(req)变体,均解释在文档中).
经过几个小时的挣扎,我得出结论,我需要一些帮助(免责声明:我是一个流媒体新手).
HTML表单:
<form action="/uploadPicture" method="post" enctype="multipart/form-data">
<input name="picture" type="file" accept="image/*">
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
Express bodyParser中间件以这种方式配置:
app.use(express.bodyParser({defer: true}))
Run Code Online (Sandbox Code Playgroud)
POST请求处理程序:
uploadPicture = (req, res, next) ->
form = new formidable.IncomingForm()
form.parse(req)
form.onPart = (part) ->
if not part.filename
# Let formidable handle all non-file parts (fields)
form.handlePart(part)
else
handlePart(part, form.bytesExpected)
handlePart = (part, fileSize) ->
# aws-sdk version
params …Run Code Online (Sandbox Code Playgroud) 我使用节点版本7.2.0和强大的版本1.0.17进行文件上传.更新到节点版本7.2.0后,我现在在上传文件时收到以下错误:
(node:3376)DeprecationWarning:不推荐使用os.tmpDir().请改用os.tmpdir().
我不使用form.uploadDir的deafult,而是使用一些自定义路径.
我该如何解决这个错误?非常感谢.
我无法调试此问题或在线查找解决方案.Node.js的新手,希望有人能提供解决方案
错误:更新了控制台日志信息2012年2月11日星期六上午7:27:17
Request for/ received!
About to route a request for /
Request handler 'start' was called.
Request for/favicon.ico received!
About to route a request for /favicon.ico
No request handler found for /favicon.ico
Request for/favicon.ico received!
About to route a request for /favicon.ico
No request handler found for /favicon.ico
Request for/upload received!
About to route a request for /upload
Request handler 'upload' was called.
about to parse
{ output: [],
outputEncodings: [],
writable: true,
_last: false, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个小的node.js应用程序,它从HTML表单接收多部分POST并将传入的数据传递给Amazon S3.的强大的模块提供了多部分解析,露出各部分作为节点流.该诺克斯模块处理PUT到S3.
var form = new formidable.IncomingForm()
, s3 = knox.createClient(conf);
form.onPart = function(part) {
var put = s3.putStream(part, filename, headers, handleResponse);
put.on('progress', handleProgress);
};
form.parse(req);
Run Code Online (Sandbox Code Playgroud)
我通过socket.io向浏览器客户端报告上传进度,但是很难获得这些数字以反映节点上传到s3的真实进度.
当浏览器到节点上传瞬间发生时,就像节点进程在本地网络上运行时一样,进度指示器立即达到100%.如果文件很大,即300MB,则进度指示器缓慢上升,但仍然比我们的上游带宽允许的速度快.在达到100%进度后,客户端然后挂起,大概等待s3上传完成.
我知道在内部putStream使用Node的stream.pipe方法,但我不明白这是如何工作的细节.我的假设是节点尽可能快地吞噬输入数据,将其丢入内存.如果写入流可以足够快地获取数据,则很少有数据一次保存在存储器中,因为它可以被写入和丢弃.如果写入流速度很慢,就像在这里一样,我们可能必须将所有传入数据保留在内存中,直到可以写入为止.由于我们正在侦听data读取流上的事件以便取得进展,因此我们最终报告上传速度比实际速度快.
我对这个问题的理解是否接近标记?我该怎么办呢?我需要坐下来脏write,drain和pause?
我这样做
gm(jpgName).setFormat('jpg')
.resize(160,158)
.compress('JPEG')
.write(fs.createWriteStream(jpgName),function(err){
if(err){
console.log(err,jpgName);
res.send(400);
}else{
console.log('file formated to jpg' + jpgName);
Run Code Online (Sandbox Code Playgroud)
我明白了
{ [Error: Command failed: gm convert: Empty input file (/home/ubuntu/node/uploads/icon.jpg). ] code: 1, signal: null }
Run Code Online (Sandbox Code Playgroud)
如果我在此处写入的第一行之前停止代码,然后查看该文件,则它具有文件长度.如果我让这个过程发生(错误输出)然后查看文件,那么它的大小为0字节.
我也试过这个:
fs.stat(jpgName, function (err, stats) {
console.log('file size:',stats.size);
gm(jpgName).setFormat('jpg')
.resize(160,158)
.compress('JPEG')
.write(fs.createWriteStream(jpgName),function(err){
if(err){
console.log('console.log error writing jpg file',err,jpgName);
fs.unlink(jpgName);
callback(400);
return;
}else{//...
Run Code Online (Sandbox Code Playgroud)
而且我得到了一个文件大小,所以我知道在开始这个过程之前它并不是空的.
编辑:我现在开始这个过程,form.on('end')所以我可以确定整个上传过程已经完成.
function formatProfileImage(req,form,file,callback){
console.log('formatting profile image');
var ext = file.name.split('.')[1].toLowerCase();
var name = encodeURIComponent(file.name.split('.')[0].toLowerCase());
var smallName = form.uploadDir+"/"+"small_"+name+".jpg";
var jpgName = …Run Code Online (Sandbox Code Playgroud) 我在一个html页面上使用了一个强大的表格<iframe>,但我希望它能在移动设备上全屏显示.到目前为止,我使用以下代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
@import url(http://fonts.googleapis.com/css?family=Londrina+Sketch);
body {
background-color: #f3eedd;
width: 750px;
overflow:scroll;
overflow-x:hidden;
}
h2 {
font-size: 20px;
color: #c13e18;
margin: 10px 30px 10px 30px;
}
</style>
</head>
<body>
<div id="header">
<h2>Book Supheroes Unite</h2>
</div>
<div id="form">
<iframe src="http://challenge-the-box.com/wp-admin/admin-ajax.php?action=frm_forms_preview&form=sbyrt02
" frameborder="0" scrolling="no" style="width:280px;height:535px;"></iframe></div>
</html>
Run Code Online (Sandbox Code Playgroud)
我相信它与视口有关?但是,我对此并不完全确定!
我想对Express中间件功能进行单元测试,而后者又使用node-formidable来处理多部分文件上传.
这是一个人为的例子:
function doUpload(req, res, next) {
const form = new formidable.IncomingForm();
form.uploadDir = this.mediaDir;
form.keepExtensions = true;
form.type = 'multipart';
form.multiples = true;
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
}
Run Code Online (Sandbox Code Playgroud)
在使用Chrome和正在运行的Express应用程序进行测试后,此代码适用于我.
我希望我的测试代码看起来像我在模拟请求对象,但我无法弄清楚如何使用表单数据模拟请求对象.强大的回调没有触发:
it(‘handles uploads’, (done) => {
const mockReq = http.request({
host: 'example.org',
});
mockReq.url = ‘/upload’;
const res = jasmine.createSpyObj('response', [ 'json', 'send', 'status', 'render', 'header', ‘redirect’, ‘end’, ‘write;]);
const next = jasmine.createSpy('next');
//*how to emulate a …Run Code Online (Sandbox Code Playgroud) 在我的前端,我使用angular6,我有这种形式,您可以通过删除文件div或单击div打开文件选择器来选择图像.
表格是
<form [formGroup]="imageUpload" (ngSubmit)="imageUploadSubmitted($event.target)" >
<div id="imageDrop" (click)='imageInput.click()' (drop)="drop($event)" (dragover)="allowDrop($event)" #imageDrop></div>
<input type="file" (change)='imageChange($event)' #imageInput id="imageInput" name = 'imageInput' accept=".png, .jpg, .jpeg, .gif" formControlName="imageInput" required >
<button type="submit" >Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)
这是打字稿
selectedFile:File=null;
allowDrop(e) {
e.preventDefault();
}
drop(e) {
e.preventDefault();
this.imageUpload.controls.imageInput.reset();
this.selectedFile = e.dataTransfer.files[0];
let input = this.imageUpload.controls.imageInput as any;
input.value = e.dataTransfer.files[0];
}
imageChange(e){
this.selectedFile = e.target.files[0];
}
Run Code Online (Sandbox Code Playgroud)
因此,在删除图像时,从事件中获取它并将其放入文件输入中.提交表单后,将表单数据发送到服务进行发布.该console.log显示File对象(__proto__ : File无论你从文件选择器中选择了一个图像,或者一个下降的)div.
imageUploadSubmitted(form){
console.log('imageInput value - ', this.imageUpload.controls.imageInput.value);
this.mapcmsService.uploadImage(form).subscribe((data) …Run Code Online (Sandbox Code Playgroud) formidable ×10
node.js ×9
amazon-s3 ×2
javascript ×2
angular ×1
async.js ×1
express ×1
file-upload ×1
forms ×1
html ×1
iframe ×1
jasmine ×1
mobile ×1
unit-testing ×1