【base64上传 和 MultipartFile上传】- SpringBoot

【base64上传 和 MultipartFile上传】

记录一下项目中遇到的上传问题,base64上传和MultipartFile上传具体实现!

一.base64上传

1.html页面(只截取了上传部分div)

<div class="form-group">
    <label class="col-sm-3 control-label"> <em style="color: red;font-style: normal;">*</em> 门店图片:</label>
    <div class="col-sm-8">
        <div class="mendian">+</div>
        <input type="file" id="fileUp"style="display:none;">
    </div>
</div>

<butten type="submit" id="submit"></butten>

2.js部分

var tx_base64 = "" ; //图片路径

$("submin").on("click",function(){
upload();
});

function upload(){
    /* 此处获取上传图片的base64码*/
    var a = $(".mendian").css("background");
    a = a.substring(a.indexOf("base64,") + 7, a.length - '") repeat scroll 50% 50% / cover padding-box border-box'.length);
   
    var storeData = new Object();
    storeData.imgMechanics = a;
        //还有其他实体此处忽略
         $.ajax({
            cache: true,
            type: "POST",
            url: "/save",
            data: JSON.stringify(storeData),//JSON序列化
            contentType: "application/json",//比较关键
            
            // 只做上传测试可以忽略返回操作部分
            error: function (request) {
                parent.layer.alert("Connection error");
            },
            success: function (data) {
                if (data.code == 0) {
                    parent.layer.msg("操作成功");
                    parent.reLoad();
                    var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
                    parent.layer.close(index);

                } else {
                    parent.layer.alert(data.msg)
                }
            }
        });
}
//门店图片上传图片选择及回显
$(".mendian").click(function () {
    $("#fileUp").click()
});
$('#fileUp').on('change',function(e){
    var b=$("#fileUp").val();
    $("#fbgimg").val(new Date().getTime()+ "_" +b.substr(b.lastIndexOf("\\")+1));
    var file = e.target.files || e.dataTransfer.files;
    if (file) {
        var reader = new FileReader();
        reader.onload = function () {
            $('.mendian').html("");
            $('.mendian').css({"background":" url(" + this.result + ") center center","background-size":"cover"});
            tx_base64 = this.result;
        }
        reader.readAsDataURL(file[0]);
    }
});

3.controller部分

    //R 为项目要求另写的返回要求,在本次base64上传中可以忽略,或根据自己替换
    @ResponseBody
	@PostMapping("/save")
	//由于ajax传值JSON序列化了,所以必须使用 @RequestBody 注解,否则接收不到
	public R save( @RequestBody StoreDataDO storeData ) {

		String path = storeData.getFbgimg();//图片路径实体,方便数据存储用,本例可以忽略
		String sqlpath = "../img/store/"+path; //数据库保存路径
     	String savePath ="E:\\"; //上传文件保存路径
		storeData.setFbgimg(sqlpath);
		
		//开始处理上传
		File dest;
		dest = new File(savePath+path);

		//判断父目录是否存在,不存在则创建
		if (!dest.getParentFile().exists()) {
				dest.getParentFile().mkdir();
		}
		//使用工具类 提供的方法 generateImage(String imgStr, String path)  上传图片并保存
		if(generateImage(storeData.getImgMechanics(),savePath+path) && storeDataService.save(storeData)>0 ) {
			return R.ok();
		}
		return R.error();
	}

4.base64上传工具类部分(通用)

public class Base64ToPhoto {
    public static boolean generateImage(String imgStr, String path) {
        if (imgStr == null) {
            return false;
           }
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // 解密
            byte[] b = decoder.decodeBuffer(imgStr);
            // 处理数据
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                b[i] += 256;
                    }
                }
             OutputStream out = new FileOutputStream(path);
             out.write(b);
             out.flush();
             out.close();
             return true;
            } catch (Exception e) {
             return false;
        }
    }
}

二.MultipartFile上传

1.html页面(只截取了上传部分div)

<div class="form-group">
    <label class="col-sm-3 control-label"> <em style="color: red;font-style: normal;">*</em> 门店图片:</label>
    <div class="col-sm-8">
        <div class="mendian">+</div>
        <input type="file" id="fileUp"style="display:none;">
    </div>
</div>

<butten type="submit" id="submit"></butten>

2.js部分

$("submin").on("click",function(){
upload();
});

function upload(){
  var formData = new FormData();
  formData.append("file", $("#fileUp")[0].files[0]);
         $.ajax({
            cache: true,
            type: "POST",
            url: "/save",
            data: formData ,
            cache: false,
            contentType: false,
            processData: false,
            success: function (data) {
            }
            });     
}
//门店图片上传图片选择及回显
$(".mendian").click(function () {
    $("#fileUp").click()
});
$('#fileUp').on('change',function(e){
    var b=$("#fileUp").val();
    $("#fbgimg").val(new Date().getTime()+ "_" +b.substr(b.lastIndexOf("\\")+1));
    var file = e.target.files || e.dataTransfer.files;
    if (file) {
        var reader = new FileReader();
        reader.onload = function () {
            $('.mendian').html("");
            $('.mendian').css({"background":" url(" + this.result + ") center center","background-size":"cover"});
            tx_base64 = this.result;
        }
        reader.readAsDataURL(file[0]);
    }
});

3.controller部分

//@RequestParam 中的 value 值需要和js [ formData.append("file", $("#fileUp")[0].files[0]) ]中append 第一个参数 "file" 一致
 @RequestMapping("/save")
    public Object fileUpload(@RequestParam(value = "file", required = false) MultipartFile file){
        if (file.isEmpty()) {
            return "上传文件不可为空";
        }
        String newfileName = file.getOriginalFilename();
        newfileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_" + newfileName;//(加个时间戳,尽量避免文件名称重复)
        String path = "E:\\" + newfileName;
        File dest = new File(path);
        //判断文件是否已经存在
        if (dest.exists()) {
            return "文件已经存在";
        }
        //判断文件父目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }
        try {
            file.transferTo(dest); //保存文件
        } catch (IOException e) {
            return "上传失败";
        }
        return dest ;
    }

总结

本次都只写了 base64 和 MultipartFile 的单文件上传,项目中遇到,便记录了下来,常用的还是 多文件上传+数据一起提交

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中将Base64转为MultipartFile的方法可以通过以下步骤完成: 1. 首先,你需要创建一个工具类,用于将Base64字符串转为MultipartFile类型的文件。你可以使用以下代码创建一个Base64ToMultipartFile的工具类: ``` import org.springframework.mock.web.MockMultipartFile; import org.springframework.util.Base64Utils; import java.io.IOException; import java.io.InputStream; public class Base64ToMultipartFile { public static MultipartFile convert(String base64String, String fileName) throws IOException { byte[] bytes = Base64Utils.decodeFromString(base64String); InputStream inputStream = new ByteArrayInputStream(bytes); return new MockMultipartFile("file", fileName, null, inputStream); } } ``` 2. 接下来,在你的Controller中,你可以使用Base64ToMultipartFile工具类将Base64字符串转为MultipartFile类型的文件。你可以使用以下代码示例: ``` import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @RestController public class ExampleController { @PostMapping("/upload") public void uploadImage(@RequestParam("base64Data") String base64Data) throws IOException { MultipartFile file = Base64ToMultipartFile.convert(base64Data, "image.jpg"); // 在这里你可以处理上的文件,比如保存到服务器或者其他的操作 } } ``` 通过以上方法,你可以将Base64字符串转为MultipartFile类型的文件。注意在Controller中使用@RequestParam注解来接收前端递的Base64字符串。你可以将该文件保存到服务器或者对它进行其他操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [base64转MultipartFile避坑](https://blog.csdn.net/kirk15951859811/article/details/128251514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Spring Boot笔记之上图片(Base64和MultipartFile)](https://blog.csdn.net/yimcarson/article/details/84937674)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值