Spring MVC 的图片上传相关

来源:互联网 发布:群优化 编辑:程序博客网 时间:2024/05/15 01:20

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越长,达到一定长度会出现问题:

  1. 使用mvc接收数据可能导致程序崩溃,所以使用原始的buffer接受大数据,并且不要期望把base64存到数据库,在存储过程中同样存在崩溃风险。
  2. 前端页面通过ajax发送过长的base64位码,因为一些原因(比如服务器请求超时,设置服务器超时时间来解决)使ajax判断请求失败,要注意后台是否接受成功。
  3. 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{        }    }}

https://github.com/Amant-huangqi/ImageIo

0 0
原创粉丝点击