功能背景
保司要求在退保申请时需要上传申请人的证件照片
项目框架
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;
}
}