web端多图片同时上传

使用效果展示,图片样式可以自行修改

在这里插入图片描述

编码实现

html

 <div class="form-group">
  <div class="col-sm-2 control-label" style="padding-top: 10px">房屋照片</div>
    <div class="col-sm-10">
        <div id="inputBox">
            <input type="file" name="file" title="请选择图片(最多6张)" id="file" multiple="multiple"
                   accept="image/png,image/jpg,image/gif,image/JPEG"/>选择图片(最多6)
        </div>
        <div id="imgBox"></div>
    </div>
</div>

js

$(function () {
    $("#file").on("change", function() {
        //获取type=file的input
        var fileImg = $("#file")[0];
        //得到所有的图片列表
        var fileList = fileImg.files;
        for(var i = 0; i < fileList.length; i++) {
            //得到每个图片的路径
            var imgSrcI = getObjectURL(fileList[i]);
            //向文件名的数组末尾添加此文件名
            imgName.push(fileList[i].name);
            //向路径的数组末尾添加路径
            imgSrc.push(imgSrcI);

            //图片压缩判断
            var pic = fileList[i];
            if(pic.size/1024 > 100){ //大于100k,进行压缩上传
                photoCompress(pic, {
                    quality: 0.2
                }, function(base64Codes){
                    var bl = convertBase64UrlToBlob(base64Codes);
                    //在文件流数组的末尾添加文件
                    imgFile.push(bl);
                });
            }else{
                //在文件流数组的末尾添加文件
                imgFile.push(pic);
            }
        }
        //将图片展示出去
        addNewContent('#imgBox');
    });
})

var imgSrc = [];  //存放图片路径
var imgFile = []; //存放文件流
var imgName = []; //存放图片名字
/**
 * 上传图片到后台
 * @param num 图片的最大数量
 * @param url 上传接口路径
 * @param data  需要同时上传的表单数据 json字符串
 * @returns {boolean}
 */
function uploadUnitInfo(num, url, data){
    if(!limitNum(num)){
        alert("最多只能上传"+num+"张照片!");
        return false;
    }

    //用FormData对象上传
    var fd = new FormData();
    //由于fd对象中已经包含<input type='file'>的input标签,如果不删除,就会造成重复上传
    fd.delete("file");
    //将文件流循环添加到FormData对象中
    for(var i=0; i<imgFile.length; i++){
        fd.append('file',imgFile[i], "file_"+Date.parse(new Date())+".jpg");
    }
    fd.append('params', data);
    //上传所有的图片
    submitPicture(url, fd);
}
//上传(将文件流数组传到后台)
function submitPicture(url,data) {
    if(url&&data){
        $.ajax({
            type: "post",
            url: url,
            async: true,
            data: data,
            //下面这两个要写成false,要不然上传不了。
            processData: false,
            contentType: false,
            success: function(r) {
                if (r.code === 0) {
                    alert('操作成功', function(index) {
                        vm.reload();
                    });
                } else {
                    alert(r.msg);
                }
            }
        });
    }else{
        alert('数据格式不正确!');
    }
}

//图片展示
function addNewContent(obj) {
    $(obj).html("");
    for(var a = 0; a < imgSrc.length; a++) {
        var oldBox = $(obj).html();
        $(obj).html(oldBox + '<div class="imgContainer">'
                +'<img class="up_image" title=' + imgName[a] + ' alt=' + imgName[a] + ' src=' + imgSrc[a] + ' οnclick="imgDisplay(this)">'
                +'<p οnclick="removeImg(this,' + a + ')" class="imgDelete">删除</p>'
            +'</div>');
    }
}
//删除
function removeImg(obj, index) {
    //向数组中删除元素
    imgSrc.splice(index, 1);
    imgFile.splice(index, 1);
    imgName.splice(index, 1);
    var boxId = "#" + $(obj).parent('.imgContainer').parent().attr("id");
    addNewContent(boxId);
}
//限制图片个数
function limitNum(num){
    if(!num){
        return true;
    }else if(imgFile.length>num){
        return false;
    }else{
        return true;
    }
}

//当鼠标移到图片上时,显示x删除
function imgDisplay(obj) {
    var src = $(obj).attr("src");
    var imgHtml = '<div style="width: 100%;height: 100vh;overflow: auto;background: rgba(0,0,0,0.5);text-align: center;position: fixed;top: 0;left: 0;z-index: 1000;">'
            +'<img src=' + src + ' style="margin-top: 100px;width: 70%;margin-bottom: 100px;"/>'
            +'<p style="font-size: 50px;position: fixed;top: 30px;right: 30px;color: white;cursor: pointer;" οnclick="closePicture(this)">×</p>'
        +'</div>'
    $('body').append(imgHtml);
}
//关闭
function closePicture(obj) {
    $(obj).parent("div").remove();
}
//图片预览路径
function getObjectURL(file) {
    var url = null;
    if(window.createObjectURL != undefined) { // basic
        url = window.createObjectURL(file);
    } else if(window.URL != undefined) { // mozilla(firefox)
        url = window.URL.createObjectURL(file);
    } else if(window.webkitURL != undefined) { // webkit or chrome
        url = window.webkitURL.createObjectURL(file);
    }
    return url;
}
//清空图片
function resetImage() {
    imgSrc = [];  //存放图片路径
    imgFile = []; //存放文件流
    imgName = []; //存放图片名字
}

/*
三个参数
file:一个是文件(类型是图片格式),
w:一个是文件压缩的后宽度,宽度越小,字节越小
objDiv:一个是容器或者回调函数
photoCompress()
 */
function photoCompress(file,w,objDiv){
    var ready=new FileReader();
    /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
    ready.readAsDataURL(file);
    ready.onload=function(){
        var re=this.result;
        canvasDataURL(re,w,objDiv)
    }
}
function canvasDataURL(path, obj, callback){
    var img = new Image();
    img.src = path;
    img.onload = function(){
        var that = this;
        // 默认按比例压缩
        var w = that.width,
            h = that.height,
            scale = w / h;
        w = obj.width || w;
        h = obj.height || (w / scale);
        var quality = 0.7;  // 默认图片质量为0.7
        //生成canvas
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        // 创建属性节点
        var anw = document.createAttribute("width");
        anw.nodeValue = w;
        var anh = document.createAttribute("height");
        anh.nodeValue = h;
        canvas.setAttributeNode(anw);
        canvas.setAttributeNode(anh);
        ctx.drawImage(that, 0, 0, w, h);
        // 图像质量
        if(obj.quality && obj.quality <= 1 && obj.quality > 0){
            quality = obj.quality;
        }
        // quality值越小,所绘制出的图像越模糊
        var base64 = canvas.toDataURL('image/jpeg', quality);
        // 回调函数返回base64的值
        callback(base64);
    }
}
/**
 * 将以base64的图片url数据转换为Blob
 * @param urlData
 *            用url方式表示的base64图片数据
 */
function convertBase64UrlToBlob(urlData){
    var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

前端调用

uploadUnitInfo(6, '/gz/unit/save', JSON.stringify(vm.unit));

后台接收
在这里插入图片描述

	@RequestMapping("/save")
	@RequiresPermissions("gz:unit:save")
	public R save(MultipartFile file[], @RequestParam(value = "params") String params){
		//业务处理逻辑
	}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值