今天做一個截圖上傳到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.另外一哥們兒寫過的代碼,還沒仔細看,先存檔一下