springboot MultipartFile 多图片上传

实现一个简单的多张图片上传。使用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

Spring Boot中给MultipartFile类型的图片添加水印可以通过以下步骤实现: 1. 首先,确保已经引入了相关的依赖,例如spring-boot-starter-web和spring-boot-starter-validation。 2. 创建一个自定义的水印图片,该图片可以是任何带有透明背景的图片,可以使用图片处理工具如Adobe Photoshop或在线图片编辑器来创建。 3. 在Spring Boot应用的Controller中创建一个POST请求的处理方法,MultipartFile类型的图片参数和其他需要的参数。 4. 使用Java的ImageIO类将上传的MultipartFile类型的图片转换成BufferedImage对象。 5. 使用Java Graphics2D类创建一个新的BufferedImage对象,并将上传的图片绘制到新的图像上。 6. 使用Java Graphics2D类将水印图片绘制到新的图像上,并通过设置透明度来控制水印的透明度。 7. 最后,使用ImageIO类将新的BufferedImage对象转换回MultipartFile类型的图片,并保存到指定的目录中。 以下是一个示例代码,实现了在Spring Boot中给MultipartFile类型的图片添加水印的功能: ```java import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @RestController public class WatermarkController { @PostMapping("/addWatermark") public String addWatermark(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return "请选择要上传的文件"; } try { // 将上传的图片转换成BufferedImage对象 BufferedImage image = ImageIO.read(file.getInputStream()); // 加载水印图片 BufferedImage watermark = ImageIO.read(new File("path/to/watermark.png")); // 创建新的BufferedImage对象 BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); // 创建Graphics2D对象,并绘制上传的图片 Graphics2D graphics2D = newImage.createGraphics(); graphics2D.drawImage(image, 0, 0, null); // 设置水印透明度 AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); graphics2D.setComposite(alphaComposite); // 绘制水印图片 graphics2D.drawImage(watermark, 0, 0, null); // 保存新的图片到指定目录 ImageIO.write(newImage, StringUtils.getFilenameExtension(file.getOriginalFilename()), new File("path/to/output.png")); graphics2D.dispose(); } catch (IOException e) { // 处理异常 } return "添加水印成功"; } } ``` 请注意,以上代码仅为示例,并未完整处理异常、文件路径等问题,实际应用中请根据需求进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值