spring mvc 自带的文件上传
http://www.cnblogs.com/fjsnail/p/3491033.html
1.配置图片上传解析器
springmvc使用commons-fileupload进行图片上传。
需要导入的jar包为:commons-fileupload-1.2.2.jar和依赖包commons-io-2.4.jar。
然后在springmvc中配置图片上传解析器:
<!-- 文件上传
CommonsMultipartResolver依赖我们传入的fileupload jar包-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
2.编写controller方法
1.前端页面通过from表单进行上传
@RequestMapping(value="/thumbnail",method=RequestMethod.POST)
public ModelAndView thumbnail(@RequestParam("image")CommonsMultipartFile file,HttpSession session){
String uploadPath = "/images/ori_img";
String realUploadPath = session.getServletContext().getRealPath(uploadPath);//绝对路径
String imageUrl = uploadService.uploadImage(file, uploadPath, realUploadPath);//图片上传
String thumImageUrl = thumbnailService.thumbnail(file, uploadPath, realUploadPath);//缩略图的生成
ModelAndView ret = new ModelAndView();
ret.addObject("imageURL",imageUrl);
//ret.addObject("thumImageUrl", thumImageUrl);
ret.setViewName("thumbnail");
return ret;
}
图品上传处理
public String uploadImage(CommonsMultipartFile file,String uploadPath,String realUploadPath){
InputStream is = null;
OutputStream os = null;
Calendar calendar = Calendar.getInstance();
long imgName = calendar.getTime().getTime();
try {
is = file.getInputStream();
String des = realUploadPath + "/"+Long.toString(imgName)+file.getOriginalFilename();
os = new FileOutputStream(des);
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))>0){
os.write(buffer);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(is!=null){
try{
is.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
if(os!=null){
try{
os.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
return uploadPath + "/"+Long.toString(imgName)+file.getOriginalFilename();
}
缩略图处理:
ps:使用了Thumbnails工具类
public class ThumbnailService {
public static final int WIDTH = 100;
public static final int HEIGHT = 100;
public String thumbnail(CommonsMultipartFile file,String uploadPath,String realUploadPath){
try {
String des = realUploadPath + "/thum" + file.getOriginalFilename();
Thumbnails.of(file.getInputStream()).size(WIDTH, HEIGHT).toFile(des);//缩略图生成
} catch (Exception e) {
// TODO: handle exception
}
return uploadPath + "/thum" + file.getOriginalFilename();
}
}
2.前端使用base64位码上传图片
PS:图片越大,base64越长,达到一定长度会出现问题:
- 使用mvc接收数据可能导致程序崩溃,所以使用原始的buffer接受大数据,并且不要期望把base64存到数据库,在存储过程中同样存在崩溃风险。
- 前端页面通过ajax发送过长的base64位码,因为一些原因(比如服务器请求超时,设置服务器超时时间来解决)使ajax判断请求失败,要注意后台是否接受成功。
- base64位码开头字段是文件类型等,要注意截取,传到java中是json字符串的情况下,前后有双引号,也要注意截取。
@RequestMapping(value="/thumbnail_2",method=RequestMethod.POST)
@ResponseBody
public String thumbnail_2(HttpServletRequest req,HttpSession session){
StringBuffer buffer = null;
try {
BufferedReader reader = req.getReader();
buffer = new StringBuffer();
String string=null;
while ((string = reader.readLine()) != null) {
buffer.append(string);
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String uploadPath = "/images/dw_img";
String imgBase = buffer.toString().substring(1, buffer.length()-1);
//System.out.print(imgBase);
String realUploadPath = session.getServletContext().getRealPath(uploadPath);//绝对路径
ImageBinary.base64StringToImage(imgBase, realUploadPath);
return "OK";
}
public class ImageBinary {
static BASE64Decoder decoder = new sun.misc.BASE64Decoder();
static void base64StringToImage(String base64String,String realUploadPath) {
Calendar calendar = Calendar.getInstance();
long imgName = calendar.getTime().getTime();
try {
byte[] bytes1 = decoder.decodeBuffer(base64String);
FileOutputStream os = new FileOutputStream(new File(realUploadPath+"/"+Long.toString(imgName)+".jpg"));
os.write(bytes1);
os.close();
// ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
// BufferedImage bi1 = ImageIO.read(bais);
// File w2 = new File(realUploadPath+"/"+Long.toString(imgName)+".png");//
// //File w2 = new File("f://2.png");// 可以是jpg,png,gif格式
// ImageIO.write(bi1, "jpg", w2);// 不管输出什么格式图片,此处不需改动
} catch (IOException e) {
e.printStackTrace();
}finally{
}
}
}