SpringBoot上传图片(多图片上传)

代码

pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.3</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.26</version>
        </dependency>

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多图片上传</title>
</head>
<body>
<form name="form" id="form" action="multipleImageUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="fileName" id="filename" accept="image/png, image/jpeg, image/jpg" multiple="multiple" onchange="checkImage(this)">
    <input type="button" id="submitBtn" onclick="checkSubmit()" value="上传"/>
</form>
<div id="onLoadImage">

</div>
</body>
<script src="/webjars/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">

    var curFiles = [];//文件数组,用来保存上传的文件信息

    //检查上传的图片
    function checkImage(obj) {
        var files = obj.files;
        console.log(files.length);
        if(files){

            if(files.length <= 3) {//把一次上传图片数限制在3张
                for (var i = 0; i < files.length; i++) {
                    var item = files.item(i);
                    var size = item.size;
                    if (size / 1000 < 100) { //简易大小限制100K
                        curFiles.push(item);
                    }
                    else {
                        alert("第" + (i + 1) + "张图片过大");
                    }
                }
            }
            else{
                $("#filename").val("");
                alert("一次最多上传3张图片");
            }
        }
        else {
            $("#filename").val("");
            alert("请选择上传文件");
        }

        //去除文件名相同的情况(上传列表中多次出现同一个文件)
        for (var i = 0; i < curFiles.length - 1; i++) {
            for (var j = 1; j < curFiles.length; j++) {
                if (i != j) {
                    if (curFiles[i].name == curFiles[j].name) {
                        curFiles.splice(j, 1)
                    }
                }
            }
        }

        //判断上传图片大小(100KB)
        for(var i = 0; i < curFiles.length; i++){
            var size = curFiles[i].size;
            if(size/1000>100){
                curFiles.splice(i, 1);
            }

        }

        console.log(curFiles);

        onLoadImage();
    }

    //预览图片
    function onLoadImage() {
        $("#onLoadImage").html("");
        for(var i = 0; i < curFiles.length; i++){
            (function(i){
                var file = curFiles[i];
                var reader = new FileReader();
                reader.readAsDataURL(file);
                reader.onload = function(){
                    $('#onLoadImage').append("<img src='"+reader.result+"'/><span><span>"+file.name+"</span><button id='"+i+"' onclick='del(this.id)'>删除</button></span><br>");
                }
            })(i)
        }
    }

    //删除功能
    function del(id) {
        var name = $("#"+id).prev().text();
        console.log(name);
        curFiles = curFiles.filter(function(file) {
            return file.name !== name;
        });
        console.log(curFiles);
        onLoadImage();
    }

    //上传功能的实现
    function checkSubmit() {
        if(curFiles.length>0){
            var formdata =  new FormData($('#form')[0]);
            for (var i = 0; i<curFiles.length; i++) {
                formdata.append('uploadFiles', curFiles[i]);
            }
            console.log(formdata);
            $.ajax({
                url: 'multipleImageUpload',
                type: 'post',
                data: formdata,
                processData: false,
                contentType: false,
                success: function(data) {
                    alert(data.length+"个上传结果");
                    for(var k in data){
                        var num=Number(k)+1;
                        alert("第"+num+"张上传结果:"+data[k].result_msg);
                        if(data[k].hasOwnProperty("relativePath"))
                            alert("第"+num+"张相对路径:"+data[k].relativePath);
                    }
                },
                error: function(err) {
                    alert("上传失败");
                }
            });
        }
        else{
            alert("请选择文件后上传");
        }
    }

</script>
</html>

后台

 @RequestMapping("/multipleImageUpload")
    public List multipleImageUpload(@RequestParam("uploadFiles") MultipartFile[] files){
        System.out.println("上传的图片数:"+files.length);

        List<Map<String,Object>> root=new ArrayList<Map<String,Object>>();

        for (MultipartFile file : files) {    //循环保存文件

            Map<String,Object> result=new HashMap<String, Object>();//一个文件上传的结果
            String result_msg="";//上传结果信息

            if (file.getSize() / 1000 > 100){
                result_msg="图片大小不能超过100KB";
            }
            else{
                //判断上传文件格式
                String fileType = file.getContentType();
                if (fileType.equals("image/jpeg") || fileType.equals("image/png") || fileType.equals("image/jpeg")) {
                    // 要上传的目标文件存放的绝对路径
                    final String localPath="F:\\IDEAProject\\imageupload\\target\\classes\\static\\img";
                    //上传后保存的文件名(需要防止图片重名导致的文件覆盖)
                    //获取文件名
                    String fileName = file.getOriginalFilename();
                    //获取文件后缀名
                    String suffixName = fileName.substring(fileName.lastIndexOf("."));
                    //重新生成文件名
                    fileName = UUID.randomUUID()+suffixName;
                    if (FileUtils.upload(file, localPath, fileName)) {
                        //文件存放的相对路径(一般存放在数据库用于img标签的src)
                        String relativePath="img/"+fileName;
                        result.put("relativePath",relativePath);//前端根据是否存在该字段来判断上传是否成功
                        result_msg="图片上传成功";
                    }
                    else{
                        result_msg="图片上传失败";
                    }
                }
                else{
                    result_msg="图片格式不正确";
                }
            }
            result.put("result_msg",result_msg);
            root.add(result);
        }
        String root_json=JSON.toJSONString(root);
        System.out.println(root_json);
        return root;
    }

图片上传工具类

public class FileUtils {

    /**
     * @param file     文件
     * @param path     文件存放路径
     * @param fileName 保存的文件名
     * @return
     */
    public static boolean upload(MultipartFile file, String path, String fileName) {

        //确定上传的文件名
        String realPath = path + "\\" + fileName;
        System.out.println("上传文件:" + realPath);

        File dest = new File(realPath);

        //判断文件父目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }

        try {
            //保存文件
            file.transferTo(dest);
            return true;
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    }

}


效果

过程说明:

  1. 选择3张图上传(其中一张大小不符合上传要求)
  2. 删除大小符合要求的两张图片的其中一张
  3. 点击上传
    在这里插入图片描述
    单图片上传+预览
    Ajax单图片上传+预览
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值