本文章只记录过程,不讲解原理。
下面所有的操作都在搭建好的express工程下,express配置参考前面的文章。
异步上传图片只是前端的操作,后端依旧用的是formidable中的同步操作,不明白的同学可以参考上一篇文章
首先需要下载三个文件
jquery.ui.widget.js
jquery.iframe-transport.js
jquery.fileupload.js
下面下载文件包括上面的文件与服务端文件
点击下载
注意这三个文件的在网页中导入的顺序千万不能错。
-
构建上传表单
<input type="file" id="fileupload" name="files[]" >
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<div class="coverimg">
</div>
-
构建上传异步js
/*jslint unparam: true */
/*global window, $ */
$(function() {
$('#fileupload').fileupload({
url: '/upload',
dataType: 'json',
//autoUpload: false,
//acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
maxFileSize: 5000000, // 5 MB
// Enable image resizing, except for Android and Opera,
// which actually support image resizing, but fail to
// send Blob objects via XHR requests:
disableImageResize: /Android(?!.*Chrome)|Opera/
.test(window.navigator.userAgent),
previewMaxWidth: 100,
previewMaxHeight: 100,
previewCrop: true
}).on('fileuploadadd', function (e, data) {
data.context = $('<div/>').appendTo('#files');
$.each(data.files, function (index, file) {
var node = $('<p/>')
.append($('<span/>').text(file.name));
//if (!index) {
// node
// .append('<br>')
// .append(uploadButton.clone(true).data(data));
//}
node.appendTo(data.context);
});
}).on('fileuploadprocessalways', function (e, data) {
var index = data.index,
file = data.files[index],
node = $(data.context.children()[index]);
if (file.preview) {
node
.prepend('<br>')
.prepend(file.preview);
}
if (file.error) {
node
.append('<br>')
.append($('<span class="text-danger"/>').text(file.error));
}
if (index + 1 === data.files.length) {
data.context.find('button')
.text('Upload')
.prop('disabled', !!data.files.error);
}
}).on('fileuploadprogressall', function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}).on('fileuploaddone', function (e, data) {
$.each(data.result.files, function (index, file) {
if (file.url) {
var link = $('<a>')
.attr('target', '_blank')
.prop('href', file.url);
$(data.context.children()[index])
.wrap(link);
} else if (file.error) {
var error = $('<span class="text-danger"/>').text(file.error);
$(data.context.children()[index])
.append('<br>')
.append(error);
}
});
}).on('fileuploadfail', function (e, data) {
$.each(data.files, function (index, file) {
var error = $('<span class="text-danger"/>').text('File upload failed.');
$(data.context.children()[index])
.append('<br>')
.append(error);
});
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
-
配置服务端
/**
* post upload .
*/
var formidable = require('formidable'),
util = require('util'),fs=require('fs');
exports.upload = function(req, res) {
// parse a file upload
var form = new formidable.IncomingForm(),files=[],fields=[],docs=[];
console.log('start upload');
//存放目录
form.uploadDir = 'tmp/';
form.on('field', function(field, value) {
//console.log(field, value);
fields.push([field, value]);
}).on('file', function(field, file) {
console.log(field, file);
files.push([field, file]);
docs.push(file);
var types = file.name.split('.');
var date = new Date();
var ms = Date.parse(date);
fs.renameSync(file.path, "tmp/files" + ms + '_'+file.name);
}).on('end', function() {
console.log('-> upload done');
res.writeHead(200, {
'content-type': 'text/plain'
});
var out={Resopnse:{
'result-code':0,
timeStamp:new Date(),
},
files:docs
};
var sout=JSON.stringify(out);
res.end(sout);
});
form.parse(req, function(err, fields, files) {
err && console.log('formidabel error : ' + err);
console.log('parsing done');
});
};