网页上传图片js+java

用了GitHub上开源的一个项目localresizeimg(h5压缩图片,会失真,且生成的是jpg格式的),以及ajaxfileupload

/**
 * pc后台管理端 上传图片
 * 
 * @param img_id
 *          无回调函数 则将id为img_id的img赋值
 * @param width_
 * @param callBack
 *          回调函数 该函数存在优先函数 例: img_upload('imgid',400);
 *          img_upload(null,400,function(res){alert("图片路径"+src)});
 */
function img_upload(img_id, width_, callBack) {
  create_img_file_();
  $('#img_upload_file').change(function() {
    // this.files[0] 是用户选择的文件
    var index = layer.load();
    var img_upload_callback = function(result) {
      $(".cd-popup").remove();
      $('#img_upload_file').remove();
      layer.close(index);
      var status = result.status;
      var map = result.map;
      if (status == '1') {
        layer.alert(map.message);
        return false;
      } else {
        if (callBack) {
          callBack(map.fileName);
        } else {
          $("#" + img_id).attr("src", map.fileName).attr("url", map.fileName);
        }
      }
    }
    if((!!window.ActiveXObject || "ActiveXObject" in window)) {
      ajaxFileUpload(img_upload_callback);
    } else {
      lrzImgUpload(this, width_, img_upload_callback);
    }
  });
}
function create_img_file_() {
  /*if((!!window.ActiveXObject || "ActiveXObject" in window) && !(navigator.userAgent.search(/Trident/i) > 0)) {
  alert("浏览器版本过低,请升级浏览器或使用其他浏览器进行操作");
  return false;
  }*/
  if ($("#img_upload_file").length > 0) {
    $("#img_upload_file").remove();
  }
  if((!!window.ActiveXObject || "ActiveXObject" in window)) {//ie弹窗提示用户手动选择图片
    var str = '<div class="cd-popup"><div class="cd-popup1"><div class="cd-popup-container1"><p style="margin-top:0;">请选择文件</p><div class="allsq">'+
    '<input type="file" class=" txt_sq" value="" id="img_upload_file" name="img_upload_file" accept="image/*;capture=camera;" style="width:170px;margin-top: 70px"/>'+
    '</div><a href="javascript:void(0)" onclick="$(this).closest(\'.cd-popup\').remove();"><img src="'+getRootPath()+'/images/fore/tcgb.jpg" class="cd-popup-close"/></a></div></div></div>';
    $("body").append(str);
  } else {
    $("body").append('<input type="file" id="img_upload_file" style="display:none;" name="img_upload_file" accept="image/*;capture=camera;"/>')
    $("#img_upload_file").click();
  }
}

function lrzImgUpload(obj,width_, callback) {
  var exts = obj.files[0].name.split(".");
  var ext = exts[exts.length - 1];
  if(ext == 'png' || ext == 'gif') {//这两种图片不能压缩成jpg
    ajaxFileUpload(callback);
    return false;
  }
  lrz(obj.files[0], {
    width : width_
  }).then(function(rst) {
    var submitData = {
        data : rst.base64.split("base64,")[1],
        ext : ext
    };
    $.ajax({
      type : "POST",
      url : getRootPath() + '/ajaxUploadBase64',
      data : submitData,
      async: false,
      dataType : "text",
      success : function(result_) {
        var result = JSON.parse(result_);
        if(result.status != '0') {
          ajaxFileUpload(callback);
        } else {
          callback(result);
        }
      },
      complete : function(XMLHttpRequest, textStatus) {
      },
      error : function(XMLHttpRequest, textStatus, errorThrown) { // 上传失败
        var result = new Object();
        var map = new Object();
        map.message = "图片上传失败";
        result.status = "1";
        result.map = map;
      }
    });
  }).catch(function(res){
    ajaxFileUpload(callback);
  });
}

function ajaxFileUpload(callback) {
  $.ajaxFileUpload({
      url: '/ajaxUpload', //用于文件上传的服务器端请求地址
      secureuri: false, //一般设置为false
      fileElementId: 'img_upload_file', //文件上传空间的id属性  <input type="file" id="file" name="file" />
      dataType: 'json', //返回值类型 一般设置为json
      async: false,
      success: function (result) { //服务器成功响应处理函数
        callback(result);
      },
      error: function (data, status, e) {//服务器响应失败处理函数
        var result = new Object();
        var map = new Object();
        map.message = "图片上传失败";
        result.status = "1";
        result.map = map;
        callback(result);
      }
  })
}


servlet

/**  
 * Copyright(c)2013 Wuxi Lanlin Co.,Ltd. 
 * All right reserved. 
 */
package com.spring.web.servlet;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.spring.web.result.Result;
import com.spring.web.result.ResultImpl;
import com.spring.web.util.OutPrintUtil;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * Servlet implementation class FileUploadServlet
 */
@WebServlet("/ajaxUpload")
public class AjaxUpload extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static long maxSize = 104857600;
    private static String img = "gif,jpg,jpeg,png,bmp";

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        // 需要返回的fileName
        String fileName = null;
        Result result = new ResultImpl();
        if (!ServletFileUpload.isMultipartContent(request)) {
            try {
                result.setStatus("1");
                result.setMap("message", "请选择图片。");
                OutPrintUtil.OutPrint(response, result);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");
        try {
            List<FileItem> items = upload.parseRequest(request);
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            for (FileItem item : items) {
                // 其他参数
                String type = item.getContentType();
                if (type == null) {
                    continue;
                }
                // 文件参数
                fileName = item.getName();
                String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
                if (img.indexOf(fileExt) < 0) {
                    result.setStatus("1");
                    result.setMap("message", "请上传gif,jpg,jpeg,png,bmp格式图片。");
                    OutPrintUtil.OutPrint(response, result);
                    return;
                }
                if (item.getSize() > maxSize) {
                    result.setStatus("1");
                    result.setMap("message", "图片不能超出10M大小。");
                    OutPrintUtil.OutPrint(response, result);
                    return;
                }
                String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
                // 设置保存文件路径
                String realPath = request.getServletContext().getRealPath("/upload");
                String saveUrl = request.getContextPath() + "/upload/";
                File dir = new File(realPath);
                File f = new File(dir, newFileName);
                item.write(f);
                String pp = realPath + "/" + newFileName;
                if (item.getSize() > 500 * 1024) {
                    // ImageTools.cutImage(300, 300, pp, pp);
                    compressPic(f, pp, item.getSize() > 1024l * 1024l ? "1" : "2", 0.9f);
                    // 压缩文件 大于1m 速度优先 0.9压缩质量 大小为300k左右
                }
                result.setMap("fileName", saveUrl + newFileName);
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回结果
        OutPrintUtil.OutPrint(response, result);
    }

    public static void compressPic(File file, String fileName, String flag, Float rat) {
        try {
            Image img = ImageIO.read(file);
            // 判断图片格式是否正确
            if (img.getWidth(null) == -1) {
                System.out.println(" can't read,retry!" + "<BR>");
            } else {
                int width = img.getWidth(null);
                int height = img.getHeight(null);
                int s = 1;
                if (width > 900 || height > 768) {
                    // 为等比缩放计算输出的图片宽度及高度
                    int rate1 = width / 900;
                    int rate2 = height / 768;
                    // 根据缩放比率大的进行缩放控制
                    s = rate1 > rate2 ? rate1 : rate2;
                }
                width = width / s;
                height = height / s;
                BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                /*
                 * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
                 */
                if (flag.equals("2")) {
                    tag.getGraphics().drawImage(img.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
                } else {
                    tag.getGraphics().drawImage(img, 0, 0, width, height, null);
                }
                FileOutputStream out = new FileOutputStream(fileName);
                // JPEGImageEncoder可适用于其他图片类型的转换
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                // 压缩质量
                JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
                // 压缩质量
                jep.setQuality(rat, true);
                encoder.encode(tag, jep);
                out.close();
            }
            // System.out.println("压缩成功!");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
package com.spring.web.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Decoder;
import com.spring.web.result.Result;
import com.spring.web.result.ResultImpl;
import com.spring.web.util.OutPrintUtil;

@WebServlet("/ajaxUploadBase64")
public class AjaxUploadBase64 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        Result result = new ResultImpl();
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String data = request.getParameter("data");
        String ext = request.getParameter("ext");
        String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + ext;
        // 设置保存文件路径
        String realPath = request.getServletContext().getRealPath("/upload");
        String saveUrl = request.getContextPath() + "/upload/";
        if (!GenerateImage(data, realPath + "/" + newFileName)) {
            result.setStatus("1");
            result.setMap("message", "请上传gif,jpg,jpeg,png,bmp格式图片。");
            OutPrintUtil.OutPrint(response, result);
        } else {
            result.setMap("fileName", saveUrl + newFileName);
            OutPrintUtil.OutPrint(response, result);
        }
    }

    public static boolean GenerateImage(String imgStr, String imgFilePath) { // 对字节数组字符串进行Base64解码并生成图片
        if (imgStr == null || null == imgFilePath) // 图像数据为空
            return false;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// 调整异常数据
                    b[i] += 256;
                }
            }
            // 生成jpeg图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b, 0, b.length);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

}

public class OutPrintUtil {     public static void OutPrint(HttpServletResponse response, Object obj) {         response.setHeader("Content-type", "text/html;charset=UTF-8");         response.setContentType("text/html;charset=utf-8");         Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();         String json = gson.toJson(obj);         try {             PrintWriter out = response.getWriter();             out.println(json);             out.flush();             out.close();         } catch (Exception e) {             e.printStackTrace();         }     } }

猜你喜欢

转载自blog.csdn.net/cgf_01/article/details/74547834