实现一个简单的多张图片上传。使用MultipartFile。

关于MultipartFile的配置

# 是否支持多文件上传
spring.servlet.multipart.enabled=true
# 文件写入磁盘的阈值
spring.servlet.multipart.file-size-threshold=0B
# 上传文件的保存地址
spring.servlet.multipart.location=
# 上传文件的最大值
spring.servlet.multipart.max-file-size=1MB
# 请求的最大值
spring.servlet.multipart.max-request-size=10MB
# 是否在文件或参数访问时延迟解析多部分请求
spring.servlet.multipart.resolve-lazily=false

Spring Boot应用上传文件时报错 - 云+社区 - 腾讯云 (tencent.com)

controller

    @PostMapping("/pic")
    public ResponseEntity<String> pic(MultipartFile[] pictures, HttpSession session) throws IOException {
        String url = "/files";
        String path = System.getProperty("user.dir")+url;

        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdirs();
        }

        long count = Arrays.asList(pictures).stream()
                .map(MultipartFile::getOriginalFilename)
                .filter(String::isEmpty).count();
        if(count != pictures.length){
            for (MultipartFile picture : pictures) {
                String originalFilename = picture.getOriginalFilename();
                //todo 这里可以改变文件名
                //......

                //写文件
                picture.transferTo(new File(realPath +"/"+ originalFilename));
            }
            return new ResponseEntity<String>("上传成功",HttpStatus.OK);
        }
        return new ResponseEntity<String>("上传失败",HttpStatus.INTERNAL_SERVER_ERROR);
    }

html

<form class="avatar-upload" action="#" id="fileForm">
    <div class="avatar-edit">
         <input type="file" name="pictures" id="multipleFiles" multiple accept="image/png, image/jpg, image/jpeg">
         <label for="multipleFiles"></label>
    </div>
    <div class="avatar-preview">
         <div id="files">
                            
         </div>
         <button type="button" class="btn btn-primary btn-sm" onclick="UploadFiles()">提交</button>
     </div>
</form>

js

function readURLFiles(file) {
    if(file){
        let reader = new FileReader();
        reader.filename = file.name;

        //异步执行
        reader.onload = function (ev) {
            let html = "<image src='"+ev.target.result+"'style='border-radius: 50%' width='128' height='128'>"+
            "<span>"+ev.target.filename+"</span>";
            $("#files").append(html);
            console.log(ev);
        }

        console.log(file);
        reader.readAsDataURL(file);
    }
}



$(function () {
        //多文件上传
        $('#multipleFiles').change(function () {
            console.log("多文件input变化了");
            //清空显示栏中的图片
            $('#files').html("");
            if(this.files){
                for(let i=0,len=this.files.length;i<len;i++){
                    readURLFiles(this.files[i]);
                }
            }
        });
        
})

function UploadFiles(){
    //获取form表单中所有属性  key为name值
    var formData = new FormData($("#fileForm")[0]);//FormData序列化表单数据
    $.ajax({
        url: '/pic',
        type: 'POST',
        dataType:"text",
        data: formData,
        processData: false,
        contentType: false,
        success: function(data) {
            window.confirm(data);
        },
        error: function(res) {
            console.log(res);
            alert("失败");
        }
    });
}

ajax的dataType写的是text。写json,会因为controller返回值与响应的数据格式不符一直走error方法。不写dataType也可以。

效果图

在这里插入图片描述

相关

FileReader - Web API 接口参考 | MDN (mozilla.org)
input事件和change事件区别_唔西迪西的博客-CSDN博客_input事件和change事件
SpringMVC学习总结(七)@RequestBody/RequestEntity/@ResponseBody/SpringMVC处理Json和Ajax/ResponseEntity/文件上传和下载_ZaynFox的博客-CSDN博客_requestentity
java.util.stream 简介_崔显龙的博客-CSDN博客_java.util.stream

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐