Spring MVC 的图片上传相关

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值