需求:
项目中需要上传附件,类型包括pdf、word、excel、图片等,要求如果上传的文件中有图片需要自动压缩。
解决方案:
在web端使用canvas把图片压缩成较小的格式。
开发过程中遇到不少难点,贴出代码供大家参考,js代码:
/*
说明:这是上传插件,基于jquery(暂时还没有做成插件的形式)
时间:2019-01-25
作者:gaobin
*/
var ud_upload = {
paras: {
btn: "",//触发 按钮 的id
fileName: "AttachmentFile",//上传file的名称
uploadPath: "",//上传路径
accept: "image/*",// 图片"image/*",所有文件:*/*
isMultiple: true,//默认上传多个文件
data: function () {
return {};
},
complete: function () { }
},
upload: function (file, name) {
console.log("上传");
var _this = this;
//开始上传非图片文件
var formData = new FormData();
//压缩后的图片放到form中
formData.append("AttachmentFile", file);
if (typeof file === "string") {
formData.append("AttachmentFileTitle", name);
}
var _data = _this.paras.data();
//向form中添加客户参数
for (var key in _data) {
formData.append(key, _data[key]);
}
$.ajax({
url: _this.paras.uploadPath,
type: 'POST',
dataType: "JSON",
data: formData,
processData: false, //tell jQuery not to process the data
contentType: false, //tell jQuery not to set contentType
async: false,
cache: false,
success: function (res) {
_this.paras.complete(res);
//filesArr.count--;
//delete filesArr.arr[0];
}
});
// }
},
filesArr: { count: 0, arr: [] },
callback: function callback(img, file) {
//这里传递过来的img图片对象是装载完毕的
//开始压缩img
var data = compress(img, {});
img = null;
this.uploadImg(data, file.name);
},
init: function (paras) {
//显示上传中
//top.loading();
var _this = this;
//初始参数
var _p = $.extend({}, _this.paras, paras);
_this.paras = _p;
$("#" + paras.btn).bind("click", function () {
//触发上传,这里id要唯一 ,否则会出错
$("#" + paras.fileName + _p.btn).click();
});
var _temp_form = $("
服务端代码没什么难点,如果不会写可以下载。
难点:
同时上传多个文件时发现只能最后一个上传成功,开始我是直接使用this.files循环上传,测试了一下午发现这一行代码比较关键, var files = Array.prototype.slice.call(this.files); 改成这样后多个文件可以正常上传了。
全部源代码可下载:同时上传多个文件,图片自动压缩