由于项目要求接触了WebUploader,期间参考了官网以及很多网友的资料,现将整个代码以及过程中遇到的小难题解决方案分享给大家。
项目要求:
1.初始状态下,隐藏上传文件按钮,选择下拉框实际内容时才显现
2.针对每一个下拉框菜单,只能上传一个文件,且格式为.xlsx
3.选择文件后自动上传
本人用了bootstrap,格式方面的问题毋需关注,只需要注意这里的class我用了hidden
<div id="uploader" class="form-inline pull-right col-md-8 hidden">
<div class="form-group form-inline">
<div id="picker" style="float:left">选择文件</div>
<!--用来存放文件信息-->
<div id="thelist" class="uploader-list"></div>
</div>
</div>
下拉框的html代码为
<select id="resourceType" class="form-control " >
<option value="" selected = "selected" >请选择</option>
<option value="1">图书</option>
<option value="2">档案</option>
<option value="3">古籍</option>
<option value="4">学术论文</option>
<option value="5">文学作品</option>
</select>
重头戏来了,接下来是我使用的WebUploader代码
//Excel文件上传
//由于上传的不是大型图片,因此压缩、缩略图、分片等的操作在此没有展示
/*init webuploader*/
//注意,这一步的变量提取是官网的资料中缺少的
var $list = $('#thelist');
var uploader = WebUploader.create({
//是否自动上传,如果为false,则在之前的html代码中需要再设置一个button来进行上传
auto: true,
// swf文件路径(根据你自己的工程目录进行设置)
swf: '../../static/lib/plugins/webuploader/Uploader.swf',
// 文件接收服务端(路由)
server: '/copyright/resourceBind/excelUpload',
pick: {
// 选择文件的按钮。可选
id: '#picker',
//不允许单次上传时同时选择多个文件
multiple: false
},
//允许上传的文件总数量为1
fileNumLimit: 1,
// 只允许选择excel表格文件。
accept: {
title: 'Applications',
extensions: 'xlsx',
mimeTypes: 'application/xlsx'
}
});
/** * 验证文件格式、数量以及文件大小 */
uploader.on("error", function(type) {
if (type == "Q_TYPE_DENIED") {
alert("请上传xlsx格式文件");
} else if (type == "F_EXCEED_SIZE") {
alert("文件大小不能超过8M");
} else if (type == "Q_EXCEED_NUM_LIMIT") {
alert("一种资源只能上传一个文件");
}
});
// 当有文件被添加进队列的时候
uploader.on('fileQueued', function(file) {
$list.append('<span id="' + file.id + '" class="item">' +
'<span class="info">' + file.name + '</span>' +
'<p class="state">等待上传...</p>' +
'</span>');
});
// 文件上传过程中创建进度条实时显示。
uploader.on('uploadProgress', function(file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress .progress-bar');
// 避免重复创建
if (!$percent.length) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo($li).find('.progress-bar');
}
$li.find('p.state').text('上传中');
$percent.css('width', percentage * 100 + '%');
});
// 文件上传成功
uploader.on('uploadSuccess', function(file) {
$('#' + file.id).find('p.state').text('已上传');
});
//文件上传是否成功的状态
var flag = true;
//根据服务器返回的数据判断文件是否上传成功
//这个函数会接收来自服务器的文件上传是否成功的状态,这个事件发生在‘uploadError’之前
//data为服务器返回的数据,是个对象,如果服务器返回的是json格式,那么正和我们的意。如果不是json格式,response._raw里面可以拿到原始数据。所以,webuploader对于后端返回的数据格式是没有要求的
uploader.on("uploadAccept", function(file, data) {
if (data.op_result == "0") {
// 通过return false来告诉组件,此文件上传有错。
flag = false;
return false;
}
});
// 文件上传失败,显示上传出错
uploader.on('uploadError', function(file) {
$('#' + file.id).find('p.state').text('上传出错');
});
// 完成上传完
uploader.on('uploadComplete', function(file) {
$('#' + file.id).find('.progress').fadeOut();
});
关于下拉框事件的代码
$("#toolbar_btnList_resource").on('change', '#resourceType', function(event) {
event.preventDefault();
var resourceType = $("#resourceType").val();
//每当下拉框发生变化,清除上一次的文件上传状态提示信息
$(".item").remove();
if (resourceType != "") {
$("#uploader").removeClass('hidden');
//解决隐藏之后显示不能点击的问题
uploader.refresh();
} else {
$("#uploader").addClass('hidden');
}
switch (resourceType) {
case "1":
$(".resourceTable").bootstrapTable("destroy");
initReportBook();
uploader.reset(); //重置uploader,可以继续上传文件
break;
case "2":
$(".resourceTable").bootstrapTable("destroy");
initReportArchive();
uploader.reset(); //重置uploader,可以继续上传文件
break;
case "3": //古籍
$(".resourceTable").bootstrapTable("destroy");
initReportAncientbooks();
uploader.reset(); //重置uploader,可以继续上传文件
break;
case "4":
$(".resourceTable").bootstrapTable("destroy");
initReportPaper();
uploader.reset(); //重置uploader,可以继续上传文件
break;
case "5":
$(".resourceTable").bootstrapTable("destroy");
initReportLiteraryworks();
uploader.reset(); //重置uploader,可以继续上传文件
break;
}
});
服务器端接收文件
server: ‘/copyright/resourceBind/excelUpload’路由对应的处理程序如下(服务器端我使用的是Beego)
//excel文件上传
func (c *CopyrightController) ExcelUpload() {
f, h, err := c.GetFile("file")
defer f.Close()
checkErr(err)
if err != nil { //上传文件出错
c.Data["json"] = map[string]interface{}{"op_result": 0, "message": ""}
c.ServeJSON()
return
} else {
fmt.Println(h.Filename)
c.SaveToFile("file", "upload/"+h.Filename) // 保存位置在 /upload, 没有文件夹要先创建
}
c.Data["json"] = map[string]interface{}{"op_result": 0, "message": ""}
c.ServeJSON()
return
}