JAVA / H5上传图片并压缩

19 篇文章 0 订阅
4 篇文章 0 订阅

功能背景

保司要求在退保申请时需要上传申请人的证件照片

项目框架

Maven+SpringMVC,采用fromData进行多图片上传并预览并使用前后端双重压缩,前端使用canvas画布重绘压缩方式,

在服务端采用Thumbnails(net.coobird.thumbnailator.Thumbnails)对图片进行压缩大小

图:

图片大小:

原图:

上传后: 

下面开始代码:

导包(pom.xml):

<!--thumbnailator 压缩工具-->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>

页面代码(plySurUpImgPage.jsp):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="../common/taglibs.jsp" %>
<!DOCTYPE html>
<html>
<head>
    <title>图片上传并预览DEMO</title>
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta name="format-detection" content="telephone=no">
    <link rel="stylesheet" href="${frozenuiPath}/css/frozen.css">
    <link rel="stylesheet" href="${contextPath}/plugins/css/basic.css">
   
    <script src="http://i.gtimg.cn/vipstyle/frozenjs/lib/sea.js?_bid=304"></script>
    <script src="${frozenuiPath}/lib/zepto.min.js"></script>
    <script src="${frozenuiPath}/js/frozen.js"></script>
    <link rel="stylesheet" href="${contextPath}/plugins/css/weui.css">
	<script src="${contextPath}/plugins/js/axios.min.js"></script>
	<script src="${contextPath}/plugins/js/weui.min.js"></script>
	 <script type="text/javascript" src="${contextPath}/plugins/js/jquery.js"></script>
	
    <style type="text/css">
	    .ui-select:after{
	    	margin-top: 3px;
	    }
	    .uploader_box{
	        width:100%;
	        height: auto;
	        overflow: hidden;
	        position: relative;
	    }
	 #logimg{
	       position: absolute;
	        top:0;
	        left:0;
	        width:100%;
	        height:100%;
	        opacity:0;
	    }
	 .camera-icon{
	        width:100%;
	        height:auto;
	    }
	    .shows{
	    	opacity:1
	    }
	    .hides{
		    opacity:0;
		    display:none;
	    }
	    .weui-uploader__input-box{
	     	width:80px;
	        height:80px;
	    }
	    .weui-uploader__file{
	    	width:80px;
	        height:80px;
	    }
	</style>
</head>
<body ontouchstart>
       <header class="ui-header ui-header-positive ui-border-b ch-h3" style="position: relative;">
    	<h1>
     	  	影像文件上传
    	</h1>
	</header>
       <div class="ui-form-item ui-form-item-pure ui-border-b">
           <label for="#" style="color: #777;">影像类型:</label>
           <div class="ui-select" style="padding-top: 10px;">
               <select class="chosen-select" name="imgType" onchange="imgTypeMsg()" id="imgType">
				<option value="1">居民身份证</option>
				<option value="2">户口簿</option>
				<option value="3">出生证</option>
			</select>
           </div>
     		</div>
       <div class="ui-form-item ui-form-item-show ui-border-b" style="min-height:130px;">
          <form id="classdynamics_form" action="javascript:void(0);"  class="form_post" method="post"  enctype="multipart/form-data">
		    <div class="weui-cells__title" id="weui_cells__title"></div>
		    <div class="weui-gallery" id="gallery">
		        <span class="weui-gallery__img" id="galleryImg"></span>
		        <div class="weui-gallery__opr">
		            <a href="javascript:" rel="external nofollow" class="weui-gallery__del">
		                <i class="weui-icon-delete weui-icon_gallery-delete"></i>
		            </a>
		        </div>
		    </div>
		    <div class="weui-cells weui-cells_form">
		        <div class="weui-cell">
		            <div class="weui-cell__bd">
		                <div class="weui-uploader">
		                    <div class="weui-uploader__bd">
		                        <ul class="weui-uploader__files" id="uploaderFiles">
		                        </ul>
		                        <div class="weui-uploader__input-box">
		                            <input id="uploaderInput" class="weui-uploader__input zjxfjs_file" type="file" accept="image/*" multiple="" name="pic[]" />
		                        </div>
		                    </div>
		                </div>
		            </div>
		        </div>
		    </div>
		</form>
		<div class="ui-btn-wrap">
	       <button class="ui-btn-lg ui-btn-primary"  id="showTooltips">上传图片 </button>
	    </div>
       </div>
	<input type="hidden" id="SUBRESTVALUE" value="0" />
<%--提示框--%>
    <div id="toast" class = "hides">
        <div class="weui-mask_transparent"></div>
        <div class="weui-toast">
        	<i class="weui-icon-info weui-icon_msg"></i>
            <p class="weui-toast__content" id="weui_toast_msg">已完成</p>
        </div>
    </div>
</div>
<%--loading加载框--%>
<div id="loadingToast" class="hides">
        <div class="weui-mask_transparent"></div>
        <div class="weui-toast">
            <i class="weui-loading weui-icon_toast"></i>
            <p class="weui-toast__content" id="weui_loading_msg">数据加载中</p>
        </div>
    </div>
<div class="js_dialog hides" id="iosDialog1">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
        <div class="weui-dialog__hd"><strong class="weui-dialog__title" id="iosDialog1_title">弹窗标题</strong></div>
        <div class="weui-dialog__bd" id="iosDialog1_msg">弹窗内容,告知当前状态、信息和解决方法,描述文字尽量控制在三行内</div>
        <div class="weui-dialog__ft">
<%--            <a href="javascript:;" class="weui-dialog__btn weui-dialog__btn_default">辅助操作</a>--%>
            <a href="javascript:;" class="weui-dialog__btn weui-dialog__btn_primary" id="iosDialog1_btn" onclick="toUrl()">主操作</a>
        </div>
    </div>
</div>
<form action="${contextPath}/plySur/list" method="post" id="re_form">
    <input type="hidden" id="policyNo_S" name="policyNo" value="" />
    <input type="hidden" id="c_app_num_S" name="clNo" value="" />
</form>
<script type="text/javascript">
	$(function() {
	    /*
	     * 添加图片
	     */
	    var img_files =new Array();
	    var img_num = 0;
	    var $tooltips = $('.js_tooltips');
	    var tmpl = '<li class="weui-uploader__file" " style="background-image:url(#url#)"></li>',
	        $gallery = $("#gallery"), $galleryImg = $("#galleryImg"),
	        $uploaderInput = $("#uploaderInput"),
	        $uploaderFiles = $("#uploaderFiles")
	        ;
	    $uploaderInput.on("change", function(e){
	        var src, url = window.URL || window.webkitURL || window.mozURL, files = e.target.files;
	        var img_num_ = img_num + files.length;
	        console.log(img_num_);
	        if(img_num_>2){
	            showMsg("最多只能上传2张!");
	            return false;
	        }
	        for (var i = 0, len = files.length; i < len; ++i) {
	            var file = files[i];
	            console.log(file.size);
	            if (file.size > 10 * 1024 * 1024) {
                    showMsg("请上传不超过2M的图片");
                }else{
                	iif (url) {
     	                src = url.createObjectURL(file);
     	            } else {
     	                src = e.target.result;
     	            }
                	var reader = new FileReader();
    	            reader.readAsDataURL(file);
    	            reader.onload = function(e) {
    	                var image = new Image(); //新建一个img标签(还没嵌入DOM节点)
    	                image.src = e.target.result;
    	    			image.onload = function() {
    	                    var canvas = document.createElement('canvas');
    	                    context = canvas.getContext('2d');
    	                    imageWidth = image.width / 5;
    	                    //压缩后图片的大小
    	                    imageHeight = image.height / 5;
    	                    data = '';
    	                    canvas.width = imageWidth;
    	                    canvas.height = imageHeight;
    	                    context.drawImage(image, 0, 0, imageWidth, imageHeight);
    	                    data = canvas.toDataURL('image/jpeg');
    	                    console.log("压缩后图片大小:"+data.size);
    	                    //压缩完成
    	                    img_files[img_num] = data;
    	           			img_num  = img_num + 1;  
    	                    $uploaderFiles.append($(tmpl.replace('#url#', data)));
    	                }
    	            }
                }
	           
	        }
	        uploaderInput.value="";
	    });
	    var index;
	    $uploaderFiles.on("click", "li", function(){
	        index = $(this).index();
	        $galleryImg.attr("style", this.getAttribute("style"));
	        $gallery.fadeIn(100);
	    });
	    $gallery.on("click", function(){
	        $gallery.fadeOut(100);
	    });
	    $(".weui-gallery__del").click(function() {
	        // 删除知道图片
	        $uploaderFiles.find("li").eq(index).remove();
	        img_files.splice(index, 1);
	        img_num  = img_num - 1;
	    });
	    /*
	     * 提交
	     */
	    var class_ids ='';
	    $('#showTooltips').on('click', function() {
	        var falg = 0;
	        if(img_num == 0){
	            //图片个数为0
	            showMsg("请上传影像资料");
	            loadingClose();
	            return false;
	        }else{
	        	loadingOpen("正在提交……");
	        }
	        var formData = new FormData();
	        var t = $('#classdynamics_form').serializeArray();
	        $.each(t, function() {
	            if(this.name != "class_id[]"){
	                formData.append(this.name, this.value);
	            }
	        });
	        formData.append('class_id', class_ids);
	        formData.append('id', "{$Think.get.id}");
	        for(var x=0; x<img_files.length;x++){
	            formData.append('pic'+x, img_files[x]);
	        } 
	        var c_ply_no = $("#policyNo").val();
	        var imgType = $("#imgType").val();
	        $.ajax({
	            url: "<%=basePath%>plySur/surPageUploadImg.do?imgType="+imgType,
	            type: "post",
	            data: formData,
	            contentType: false,
	            processData: false,
	            async: false,
	            mimeType: "multipart/form-data",
	            success: function (res) {
	            	jsonOb = JSON.parse(res);
	            	$("#c_surrender_id").val(jsonOb.c_surrender_id);
	            	$("#fileName").val(jsonOb.fileName);
	                if(jsonOb.type == 1){
							if($("#c_surrender_id").val() != ""){
								showMsg("添加成功");
							}else{
								loadingClose();
								showMsg("系统异常");
							}
	                }else{
	                	showMsg("添加失败");
	                }
	            },
	            error: function (data) {
	                console.log(data);
	            }
	        });
	    });
	});
</script>
<script>
	function getBankAddress(){
	    var bankAddress = $("#bankAddress").val();
	    if(bankAddress == '0' || bankAddress == 0){
	    	$("#bankNameShow").show();
	    }else{
	   		$("#bankNameShow").hide();
	    }
	};
	function imgTypeMsg(){
	    var imgType = $("#imgType").val();
	    var msg = "";
	    if(imgType == '1' || imgType == 1){
	    	msg = "居民身份证正反面照片";
	    }else if(imgType == '2' || imgType == 2){
	    	msg = "户口簿主页及个人页";
	    }else if(imgType == '3' || imgType == 3){
	    	msg = "出生页";
	    }
	    $("#weui_cells__title").html("请上传:"+msg);
	};

    $(function() {
	    imgTypeMsg();
        $("input#code").next().click(function() { // 验证码触发事件
            createCode();
        });

        $("a.ui-icon-close").click(function() { // 页面删除按钮触发
            $(this).parent().find("input").val("");
        });

    });
	function showMsg(msg){
		$("#weui_toast_msg").html(msg);
		$("#toast").removeClass() ;
		$("#toast").addClass("shows") ;
         setTimeout(function () {
        	 $("#toast").removeClass() ;
     		$("#toast").addClass("hides") ;
         }, 2000);
	}
    function loadingOpen(msg){
    	$("#weui_loading_msg").html(msg);
		$("#loadingToast").removeClass() ;
		$("#loadingToast").addClass("shows") ;
    }
    function loadingClose(){
       	$("#loadingToast").removeClass() ;
     	$("#loadingToast").addClass("hides") ;
    }
    function iosDialog1Open(title,msg,btn){
    	$("#iosDialog1_title").html(title);
    	$("#iosDialog1_msg").html(msg);
    	$("#iosDialog1_btn").html(btn);
		$("#iosDialog1").removeClass("hides") ;
		$("#iosDialog1").addClass("shows") ;
    }
</script>

</body>
</html>

Contorller(PlySurController.java)

package com.hxjr.bwyl.controller;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import sun.misc.BASE64Decoder;

import com.hxjr.bwyl.domain.ChannelInfo;
import com.hxjr.bwyl.domain.ListEntityInfo;
import com.hxjr.bwyl.domain.PlyInfo;
import com.hxjr.bwyl.domain.PlyInsrntPerson;
import com.hxjr.bwyl.domain.SurrenderRecord;
import com.hxjr.bwyl.domain.VerificationCode;
import com.hxjr.bwyl.service.BwylService;
import com.hxjr.hx.policy.domain.WxBatch;
import com.hxjr.hx.policy.service.PolicyService;
import com.hxjr.utils.DateTimeUtil;
import com.hxjr.utils.FileUpload;
import com.hxjr.utils.JsonUtil;
import com.hxjr.utils.ModelAndViewUtil;
import com.hxjr.utils.MoneyUtil;
import com.hxjr.utils.SysConfigUtil;
import com.hxjr.utils.UUIDUtil;
import com.hxjr.utils.MultipartFile.ImageSizeUtil;
import com.hxjr.utils.date.DateUtil;
import com.hxjr.utils.log.Logger;
import com.hxjr.utils.log.impl.LogFactory;
import com.hxjr.wxuser.domain.ProvinceCity;
import com.hxjr.wxuser.service.WxUserService;

@Controller
@RequestMapping("/plySur")
public class PlySurController {
	
	private Logger logger = LogFactory.getLogger(this.getClass());
        
        @RequestMapping(value = "/surPageUploadImg", method = RequestMethod.POST)
	public void surPageUploadImg(HttpServletRequest request,HttpServletResponse response,PrintWriter out) {
    	Map<String , Object> resultRqsMap = new HashMap<String, Object>();
    	//1, 获取相关参数信息
    	String c_ply_no =  request.getParameter("c_ply_no");//保单号
    	String c_img_type = request.getParameter("imgType");//证件类型
    	String img_num =  request.getParameter("img_num");//图片数量
    	logger.info("H5退保("+c_ply_no+")影像文件上传:证件类型:imgType="+c_img_type);
    	//2. 创建此次退保的唯一标识
    	String c_surrender_id = UUIDUtil.getUuidKey();
    	//3. 配置图片上传位置
//    	String imagepath = "//EAP-6.3.0//weixin_picture//surrender//"+c_ply_no+"//"+c_surrender_id+"//";
//    	String imagepath = "//jboss//weixin_picture//surrender//"+c_ply_no+"//"+c_surrender_id+"//";
    	String imagepath = "D://Temp//"+c_ply_no+"//"+c_surrender_id+"//";
    	//4. 声明图片名称
    	String fileName = "";
    	try {
    		//5. 根据不同证件类型配置不同的路径
	    	if("1".equals(c_img_type)){
	    		//5.1 居民身份证  图片文件保存路径
	    		imagepath = imagepath+"idImg";
	    	}else if("2".equals(c_img_type)){
	    		//5.2 户口蒲  图片文件保存路径
	    		imagepath = imagepath+"residenceBookletImg";
	    	}else if("3".equals(c_img_type)){
	    		//5.3  出生证  图片文件保存路径
	    		imagepath = imagepath+"birthCertificateImg";
	    	}
	    	//6. 转换request,解析出request中的文件
			MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
			//7. 获取前端压缩后的 base64 字符串
			Map<Object, Object> fileBase64StrMap = multipartRequest.getParameterMap();
			//8. 循环图片数量
			if(null != img_num && !("".equals(img_num.trim()))){
				int fileNum = Integer.parseInt(img_num);
				for (int i = 0; i < fileNum; i++) {
					//9. 获取单个 图片base64 字符串
					String[] fileBase64Strs = (String[])fileBase64StrMap.get("pic"+i);
					//10. 将图片 base64 字符串 转换为 MultipartFile
					MultipartFile tempFiles = ImageSizeUtil.base64ToMultipart(fileBase64Strs[0]);
					//11. 服务端再次压缩图片
					MultipartFile multipartFile = ImageSizeUtil.byte2Base64StringFun(tempFiles);
					//12. 创建上传时的图片名称
					String fileUUid = UUIDUtil.getUuidKey();
					logger.info("H5退保("+c_ply_no+")影像文件上传:文件路径imagepath="+imagepath);
					//13. 获取图片扩展名
					String extName = "";
					if (multipartFile.getOriginalFilename().lastIndexOf(".") >= 0){
						extName = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
					}
					//14. 拼接新的图片名称
					fileUUid= fileUUid+extName;
					//15. 上传图片到服务器
					String tempFile = FileUpload.fileUp(multipartFile, imagepath, fileUUid);
					//16. 叠加图片名称,用"&&"分割,并返回前端 准备入库操作
					if("".equals(fileName.trim())){
						fileName = tempFile;
					}else{
						fileName = fileName+"&&"+tempFile;
					}
					
				}
			}
    	} catch (Exception e) {
    		logger.info("H5退保("+c_ply_no+")影像文件上传异常:"+e.getMessage());
			e.printStackTrace();
		}
		resultRqsMap.put("c_surrender_id",c_surrender_id);
		resultRqsMap.put("fileName", fileName);
		resultRqsMap.put("type", 1);
		//返回数据
		JSONObject json = JSONObject.fromObject(resultRqsMap);
		logger.info("H5退保("+c_ply_no+")json=="+json);
		out.print(json);
		out.close();
	}
}

图片压缩工具类:

MultipartFile  压缩后  返回 MultipartFile 

 //图片压缩
MultipartFile multipartFile = ImageSizeUtil.byte2Base64StringFun(tempFiles);

BASE64DecodedMultipartFile.java

package com.hxjr.utils.MultipartFile;

import org.springframework.web.multipart.MultipartFile;

import java.io.*;
 
/**
 * Created by byl on 2020-4-1
 */
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() {
        // TODO - implementation depends on your requirements
        return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
    }
 
    @Override
    public String getOriginalFilename() {
        // TODO - implementation depends on your requirements
        return System.currentTimeMillis() + (int)Math.random() * 10000 + "." + header.split("/")[1];
    }
 
    @Override
    public String getContentType() {
        // TODO - implementation depends on your requirements
        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);
    }
 
 
}

ImageSizeUtil.java

package com.hxjr.utils.MultipartFile;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import net.coobird.thumbnailator.Thumbnails;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
* 获取图片尺寸和截图 工具类
*
* @author byl
*/
public class ImageSizeUtil {

   private final static Logger logger = LoggerFactory.getLogger(ImageSizeUtil.class);



   /**
    * 获取图片最长边长度
    * @param params
    * @return
    */
   public static int getImageLengthOfSide(MultipartFile params){
       int lengthSize = 0;
       Map<String, Integer> result = new HashMap<String, Integer>();
       long beginTime = new Date().getTime();
       // 获取图片格式
       String suffixName = getSuffixNameInfo(params);
       try {
           Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(suffixName);
           ImageReader reader = (ImageReader) readers.next();
           ImageInputStream iis = ImageIO.createImageInputStream(params.getInputStream());
           reader.setInput(iis, true);
           result.put("width",reader.getWidth(0));
           result.put("height",reader.getHeight(0));
           if(reader.getWidth(0) > reader.getHeight(0)){
               lengthSize = reader.getWidth(0);
           }else{
               lengthSize = reader.getHeight(0);
           }
       } catch (IOException e) {
           e.printStackTrace();
       }

       return lengthSize;
   }

   /**
    * 获取图片格式
    * @param params
    * @return
    */
   public static String getSuffixNameInfo(MultipartFile params){
       String result = "";
       // 图片后缀
       String suffixName = params.getOriginalFilename().substring(
               params.getOriginalFilename().lastIndexOf("."));
       if(suffixName.indexOf("png")>0){
           result = "png";
       }else if(suffixName.indexOf("jpg")>0){
           result = "jpg";
       }else if(suffixName.indexOf("jpeg")>0){
           result = "jpeg";
       }

       return result;
   }




   /**
    * 根据指定大小压缩图片
    *
    * @param imageBytes  源图片字节数组
    * @param desFileSize 指定图片大小,单位kb
    * @return 压缩质量后的图片字节数组
    */
   public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
       if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
           return imageBytes;
       }
       long srcSize = imageBytes.length;
       double accuracy = getAccuracy(srcSize / 1024);
//       double accuracy = 0.85;
       try {
           while (imageBytes.length > desFileSize * 1024) {
               ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
               ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
               Thumbnails.of(inputStream)
                       .scale(accuracy)
                       .outputQuality(accuracy)
                       .toOutputStream(outputStream);
               imageBytes = outputStream.toByteArray();
           }
           logger.error("【图片压缩】 图片原大小="+(srcSize / 1024)+"kb | 压缩后大小="+(imageBytes.length / 1024)+"kb");
       } catch (Exception e) {
           logger.error("【图片压缩】msg=图片压缩失败!", e);
       }
       return imageBytes;
   }

   /**
    * 自动调节精度(经验数值)
    *
    * @param size 源图片大小,单位kb
    * @return 图片压缩质量比
    */
   private static double getAccuracy(long size) {
       double accuracy;
       if (size < 900) {
           accuracy = 0.85;
       } else if (size < 2047) {
//           accuracy = 0.6;
           accuracy = 0.8;
       } else if (size < 3275) {
//           accuracy = 0.44;
           accuracy = 0.7;
       } else {
           accuracy = 0.4;
       }
       return accuracy;
   }

   /**
    * base64 转MultipartFile
    * @param base64
    * @return
    */
   public static MultipartFile base64ToMultipart(String base64) {
       try {
           // 注意base64是否有头信息,如:data:image/jpeg;base64,。。。
           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;
       }
   }


   /**
    * 压缩图片
    * @return
    */
   public static MultipartFile byte2Base64StringFun(MultipartFile fileImg){
       MultipartFile result = fileImg;
       // 获取图片最长边
       int imageLengthSize = ImageSizeUtil.getImageLengthOfSide(fileImg);
       Long swd = fileImg.getSize();
       if(imageLengthSize > 4096 || swd>2500000){
           BASE64Encoder encoder = new BASE64Encoder();
           String imgData1 = null;
           try {
               InputStream inputStream = fileImg.getInputStream();
               byte[] imgData = ImageSizeUtil.compressPicForScale(ToolsUtil.getByteArray(inputStream),2000);
               imgData1 = "data:"+fileImg.getContentType()+";base64,"+encoder.encode(imgData);
               MultipartFile def = ImageSizeUtil.base64ToMultipart(imgData1);
               result = def;
           } catch (IOException e) {
               e.printStackTrace();
           }
       }

       return result;
   }




}

ToolsUtil.java

package com.hxjr.utils.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
 
/**
 * 公共 工具类
 * Created by byl on 2020-4-1
 */
public class ToolsUtil {
 
    /**
     * InputStream转换为byte[]
     *
     * @param inStream
     * @return
     * @throws IOException
     */
    public static final byte[] getByteArray(InputStream inStream) throws IOException {
        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while ((rc = inStream.read(buff, 0, 100)) > 0) {
            swapStream.write(buff, 0, rc);
        }
        byte[] in2b = swapStream.toByteArray();
        return in2b;
    }
 
 
}

接下来文件保存到服务器:

上传图片并返回图片名称:

String tempFile = FileUpload.fileUp(multipartFile, imagepath, fileUUid);

FileUpload.java

package com.hxjr.utils;


import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 上传文件
 * 创建人:byl
 * 创建时间:2020-4-1
 * @version
 */
public class FileUpload {

	/**上传文件
	 * @param file 			//文件对象
	 * @param filePath		//上传路径
	 * @param fileName		//文件名
	 * @return  文件名
	 */
	public static String fileUp(MultipartFile file, String filePath, String fileName){
		String extName = ""; // 扩展名格式:
		try {
			if (file.getOriginalFilename().lastIndexOf(".") >= 0){
				extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
			}
			copyFile(file.getInputStream(), filePath, fileName+extName).replaceAll("-", "");
		} catch (IOException e) {
			System.out.println(e);
		}
		return fileName+extName;
	}
	
	/**
	 * 写文件到当前目录的upload目录中
	 * @param in
	 * @param fileName
	 * @throws IOException
	 */
	private static String copyFile(InputStream in, String dir, String realName)
			throws IOException {
		File file = mkdirsmy(dir,realName);
		FileUtils.copyInputStreamToFile(in, file);
		return realName;
	}
	
	
	/**判断路径是否存在,否:创建此路径
	 * @param dir  文件路径
	 * @param realName  文件名
	 * @throws IOException 
	 */
	public static File mkdirsmy(String dir, String realName) throws IOException{
		File file = new File(dir, realName);
		if (!file.exists()) {
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			file.createNewFile();
		}
		return file;
	}
	
	
	/**下载网络图片上传到服务器上
	 * @param httpUrl 图片网络地址
	 * @param filePath	图片保存路径
	 * @param myFileName  图片文件名(null时用网络图片原名)
	 * @return	返回图片名称
	 */
	public static String getHtmlPicture(String httpUrl, String filePath , String myFileName) {
		
		URL url;						//定义URL对象url
		BufferedInputStream in;			//定义输入字节缓冲流对象in
		FileOutputStream file;			//定义文件输出流对象file
		try {
			String fileName = null == myFileName?httpUrl.substring(httpUrl.lastIndexOf("/")).replace("/", ""):myFileName; //图片文件名(null时用网络图片原名)
			url = new URL(httpUrl);		//初始化url对象
			in = new BufferedInputStream(url.openStream());									//初始化in对象,也就是获得url字节流
			//file = new FileOutputStream(new File(filePath +"\\"+ fileName));
			file = new FileOutputStream(mkdirsmy(filePath,fileName));
			int t;
			while ((t = in.read()) != -1) {
				file.write(t);
			}
			file.close();
			in.close();
			return fileName;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
		
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值