base64文件转MultipartFile文件 上传图片转base64

在一些项目中,上传图片或者文件过大,这个时候我们就要选择压缩文件,压缩到我们指定的范围内在上传到服务器,当然压缩也是可以放到服务器进行操作的,但是考虑到前端传输时间问题,所以我们一般都是放到前端压缩后在上传。

下面举个实例:

曾经遇见这么一个需求,前端页面需要调用相机拍照,把拍照的图片上传到服务,但是在这个过程中遇见的问题是,ios手机拍照的图片是比较大一般单张图片大小在10M左右,而Android机型却只有3M左右,如果这个页面需要上传三到四张图片不进行压缩的整个数据包就是30-40M这样上传到服务器是非常的耗时的,占带宽,而且体验很不好,所以就需要我们在前端把图片压缩了再进行上传。前端如何压缩

      /*
       三个参数
       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.οnlοad=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);
            }
}
 
function setImagePreview(e,a) {
 
    var fileMsg = e.files[0];
    if(fileMsg==null){
                return;
    }
    //文件名
    var fileName = fileMsg.name;
    //大小 字节 
    var fileSize = fileMsg.size;
 
    /*调用
    * fileMsg 是input type="file" 的值
    * quality 压缩图片质量 范围是(0-1)
    * base64Codes  就是最终压缩成的图片
    */
    photoCompress(fileMsg, {
        quality: 0.3
     }, function(base64Codes){
       //这里可以一个图片预览 把base64Codes 赋值给img的src即可
    });
}
 


 
 
html的写法:

 

<input class="btn takepicture" type="file" name="img5q" id="img5q" accept="image/*"   οnchange="javascript:setImagePreview(this,5);"/>


其实图片压缩是很简单的,这里说明一下,如果需要上传到服务器的话,把base64Codes当成一个字符串传到服务器即可,mysql表中对应的字段类型可用用longtext来储存,但是longtext的长度也是有限制的,所以在上传的时候要控制文件大小。

 

后端(java)再接收到前端传来的base64字符怎么转成我们想要的MultipartFile类型文件 或者是File类型的都可以,

为什么要介绍MultipartFile,在java中很多的spring框架,都是用的MultipartFile,所以这里就举例介绍了。

代码:

创建一个名为BASE64DecodedMultipartFile的类,一定要实现MultipartFile接口。

public class BASE64DecodedMultipartFile implements MultipartFile {
  
    private final byte[] imgContent;
    private final String header;
  
    public BASE64DecodedMultipartFile(byte[] imgContent, String header) {
        this.imgContent = imgContent;
        this.header = header.split(";")[0];
    }
  
    @Override
    public String getName() {
        return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
    }
  
    @Override
    public String getOriginalFilename() {
        return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];
    }
  
    @Override
    public String getContentType() {
        return header.split(":")[1];
    }
  
    @Override
    public boolean isEmpty() {
        return imgContent == null || imgContent.length == 0;
    }
  
    @Override
    public long getSize() {
        return imgContent.length;
    }
  
    @Override
    public byte[] getBytes() throws IOException {
        return imgContent;
    }
  
    @Override
    public InputStream getInputStream() throws IOException {
        return new ByteArrayInputStream(imgContent);
    }
  
    @Override
    public void transferTo(File dest) throws IOException, IllegalStateException {
        new FileOutputStream(dest).write(imgContent);
    }
  
    public static MultipartFile base64ToMultipart(String base64) {
        try {
            String[] baseStrs = base64.split(",");
  
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] b = new byte[0];
            b = decoder.decodeBuffer(baseStrs[1]);
  
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            return new BASE64DecodedMultipartFile(b, baseStrs[0]);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
  
}


调用方法:BASE64DecodedMultipartFile.base64ToMultipart("传入前端传来的base64字符串")。最终就会给我们返回一个MultipartFile类型的文件。
 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java中的`base64`编码将字符串换为字节数组,然后将字节数组换为`MultipartFile`对象,以便使用FastDFS进行文件上传。下面是一个示例代码: ```java import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import sun.misc.BASE64Decoder; import java.io.ByteArrayInputStream; import java.io.IOException; public class Base64ToMultipartFileUtil { public static MultipartFile base64ToMultipartFile(String base64String) throws IOException { BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer(base64String); // 将字节数组换为MultipartFile对象 MultipartFile multipartFile = new MockMultipartFile("file", "filename.jpg", "image/jpeg", new ByteArrayInputStream(bytes)); return multipartFile; } } ``` 在上面的示例代码中,`base64ToMultipartFile`方法接受一个Base64编码的字符串作为输入,并返回一个`MultipartFile`对象。你需要使用`sun.misc.BASE64Decoder`类来解码Base64字符串,然后将解码后的字节数组包装在`ByteArrayInputStream`中,并将其传递给`MockMultipartFile`构造函数。 请注意,上述示例代码使用了Spring Framework的`MockMultipartFile`类来创建`MultipartFile`对象。如果你不使用Spring Framework,你可以自己实现一个类似的`MultipartFile`对象。 完成上述代码后,你就可以使用得到的`MultipartFile`对象调用FastDFS的文件上传接口来上传文件了。具体的上传过程和FastDFS的配置请参考相关文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值