今天做一个截图上传到ftp服务器的功能,用的是jquery插件cropbox.js,后台使用的springmvc
@RequestMapping("/saveProductInfo")
public ModelAndView uploadPreviewImage(HttpServletRequest request,AbcTourProduct product,ScheduleVO scheduleVO) throws IOException{
ModelAndView modelAndView=new ModelAndView();
//1.文件上传
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
MultipartFile smallMutiFile = multipartRequest.getFile("upload-file");
MultipartFile bigMutiFile = multipartRequest.getFile("upload-file2");
String fileName1= smallMutiFile.getOriginalFilename();
String fileName2= bigMutiFile.getOriginalFilename();
int i1=fileName1.lastIndexOf(".");
String name1=fileName1.substring(0, i1);
String suffix1=fileName1.substring(i1);
String smallName=name1+UUID.randomUUID().toString()+suffix1;
int i2=fileName2.lastIndexOf(".");
String name2=fileName2.substring(0, i2);
String suffix2=fileName2.substring(i2);
String bigName=name2+UUID.randomUUID().toString()+suffix2;
File smallFile=FileUtil.multipartFileToFile(smallMutiFile);
File bigFile=FileUtil.multipartFileToFile(bigMutiFile);
boolean success1=FileUtil.ftpUpload(smallFile, smallName, "/journey/product/");
boolean success2=FileUtil.ftpUpload(bigFile, bigName, "/journey/product/");
if(success1&&success2){
String smallSrc="/journey/product/"+ smallName;
String bigSrc="/journey/product/"+ bigName;
product.setProImgUrl(bigSrc);
product.setProSmallImgUrl(smallSrc);
//新增产品
List<AbcSchedule>scheduleList =scheduleVO.getScheduleVOs();
productService.insertSelective(product, scheduleList);
}
return modelAndView;
}
这样做了之后,controller中获得的是原图而不是截图,于是我去看插件的实现,发现截图后的图片的src是base64的一串字符串,非常长,如下图只是一小部分:

然后我就想着怎样把这一串的字符串在后台转成图片进行上传,
做了一个小栗子:
package com.admin.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.net.util.Base64;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
@RequestMapping("/saveProductInfo")
public void uploadPreviewImage(String base64Str) throws IOException{
int start = base64Str.indexOf(',') + 1;
base64Str=base64Str.substring(start);
//注意:需要将头部的
给去掉
byte[] bytes=Base64.decodeBase64(base64Str);
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {// 调整异常数据
bytes[i] += 256;
}
}
OutputStream outputStream=new FileOutputStream("d://aaa");
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
}
对,就是这样,然后再用File取这个图片,在进行上传的相关步骤
注意引入的Base64的包,maven坐标是这个
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.7</version>
</dependency>
话说,这个东西花费了我大半天的功夫,,,主要原因是在截取去掉base64字符串的头部的
的时候多算了一位导致生成的图片一直是损坏无法打开的,
特此,
mark一下
=====================================================================================================
在出问题的时候在技术群问了,有两点启发
1.通过base64字符串不能获得原图片的后缀,所以巧妙的方法是不写后缀,因为图片都是在web端查看的,所以不写后缀的话会选择合适的形式来打开
2.另外一哥们儿写过的代码,还没仔细看,先存档一下

