用到的包:
java.awt.image.BufferedImage
java.awt.Graphics2D
java.io.FileOutputStream
com.sun.image.codec.jpeg.JPEGCodec
com.sun.image.codec.jpeg.JPEGImageEncoder
java.awt.AlphaComposite
java.awt.Graphics2D
java.awt.Image
//处理压缩图片
int bg_width = 800; int bg_height = 600; int set_width = 700;//处理压缩成该宽度
BufferedImage bg_src = javax.imageio.ImageIO.read(item.getInputStream());
BufferedImage tag = null;
if(bg_src != null){//上传的文件是图片的时候
int real_width = bg_src.getWidth();//图片的真实宽度
int real_height = bg_src.getHeight();//图片的真实高度
if(real_width > set_width){//当图片高度超过该限制后才压缩图片
double compute_height = (double)set_width/real_width*real_height;//等比例计算出来的图片高度
bg_width = set_width;
bg_height = (int)compute_height;
tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = tag.createGraphics();
g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
}else{
System.out.println("图片宽度小于限制,不用压缩..");
bg_src = null;
}
}
File uploadedFile = new File(savePath, newFileName);
//处理图片的时候
if(bg_src != null){//上传的文件是图片的时候
FileOutputStream fos = new FileOutputStream(uploadedFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
encoder.encode(tag);
fos.close();
}else{//不是图片还是执行以前的逻辑
item.write(uploadedFile);
}
一个处理java压缩的类:
package com.aa;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class AA {
/**
*
* @param filesrc
* @param logosrc
* @param outsrc
* @param x 位置
* @param y 位置
*/
public void composePic(String filesrc,String logosrc,String outsrc,int x,int y) {
try {
File bgfile = new File(filesrc);
Image bg_src = javax.imageio.ImageIO.read(bgfile);
// File logofile = new File(logosrc);
// Image logo_src = javax.imageio.ImageIO.read(logofile);
int bg_width =x; //bg_src.getWidth(null);
int bg_height =y; //bg_src.getHeight(null);
// int logo_width = logo_src.getWidth(null);;
// int logo_height = logo_src.getHeight(null);
BufferedImage tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = tag.createGraphics();
g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始
// g2d.drawImage(logo_src,x,y,logo_width,logo_height, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
FileOutputStream out = new FileOutputStream(outsrc);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
}catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Long star = System.currentTimeMillis();
AA pic = new AA();
pic.composePic("e:/aa.jpg","e:/aa.jpg","e:/out_pic.jpg",100,100);
Long end =System.currentTimeMillis();
System.out.print("time====:"+(end-star));
}
}
kindeditor upload_json.jsp,在我修改过的jsp源文件:(增加sftp上传、图片超过指定像素压缩代码)
<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page import="com.xz.cxzy.utils.SFTPUtil"%>
<%@page import="com.jcraft.jsch.ChannelSftp"%>
<%@page import="com.sun.image.codec.jpeg.JPEGCodec"%>
<%@page import="com.sun.image.codec.jpeg.JPEGImageEncoder"%>
<%@page import="java.awt.AlphaComposite"%>
<%@page import="java.awt.Graphics2D"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Image"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.json.simple.*" %>
<%
/**
* KindEditor JSP
*
* 本JSP程序是演示程序,建议不要直接在实际项目中使用。
* 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
*
*/
//文件保存目录路径
String savePath = pageContext.getServletContext().getRealPath("/") + "/cxzy_fckeditor/";
System.out.println(pageContext.getServletContext().getRealPath("/") );
//文件保存目录URL
String saveUrl = request.getContextPath() + "/cxzy_fckeditor/";
//定义允许上传的文件扩展名
HashMap<String, String> extMap = new HashMap<String, String>();
extMap.put("image", "gif,jpg,jpeg,png,bmp");
extMap.put("flash", "swf,flv");
extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
//最大文件大小
long maxSize = 200*1024*1024;
/sftp上传配置参数start
final String hostIp = "linux服务器ip";
final Integer hostPort = 22;
final String userName = "root";
final String password = "root";
final String hostDistinctDir = "/u01/cxzyFiles/cxzy_fckeditor/";//往服务器指定目录写文件 ps:该文件夹需要先服务器上创建好
/sftp上传配置参数end
response.setContentType("text/html; charset=UTF-8");
if(!ServletFileUpload.isMultipartContent(request)){
out.println(getError("请选择文件。"));
return;
}
//检查目录
File uploadDir = new File(savePath);
if(!uploadDir.isDirectory()){
uploadDir.mkdirs();//上传目录不存在则创建目录
//out.println(getError("上传目录不存在"));
//return;
}
//检查目录写权限
if(!uploadDir.canWrite()){
out.println(getError(uploadDir+"上传目录没有写权限。"));
return;
}
String dirName = request.getParameter("dir");
if (dirName == null) {
dirName = "image";
}
if(!extMap.containsKey(dirName)){
out.println(getError("目录名不正确。"));
return;
}
//创建文件夹
savePath += dirName + "/";
saveUrl += dirName + "/";
File saveDirFile = new File(savePath);
if (!saveDirFile.exists()) {
saveDirFile.mkdirs();
}
//党建和外网后台上传增加区分
String dirType = (String)request.getSession().getAttribute("dirType");
dirType = StringUtils.isNotBlank(dirType)?dirType:"ylj";
savePath += dirType + "/";
saveUrl += dirType + "/";
File dirTypeFile = new File(dirType);
if(!dirTypeFile.exists()) dirTypeFile.mkdirs();
//文件夹增加日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
savePath += ymd + "/";
saveUrl += ymd + "/";
File dirFile = new File(savePath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
String fileName = item.getName();
long fileSize = item.getSize();
if (!item.isFormField()) {
//检查文件大小
if(item.getSize() > maxSize){
out.println(getError("请上传200M以下的文件"));
return;
}
//处理压缩图片
int bg_width = 800; int bg_height = 600; int set_width = 700;//处理压缩成该宽度
BufferedImage bg_src = javax.imageio.ImageIO.read(item.getInputStream());
BufferedImage tag = null;
if(bg_src != null){//上传的文件是图片的时候
int real_width = bg_src.getWidth();//图片的真实宽度
int real_height = bg_src.getHeight();//图片的真实高度
if(real_width > set_width){//当图片高度超过该限制后才压缩图片
double compute_height = (double)set_width/real_width*real_height;//等比例计算出来的图片高度
bg_width = set_width;
bg_height = (int)compute_height;
tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = tag.createGraphics();
g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
}else{
System.out.println("图片宽度小于限制,不用压缩..");
bg_src = null;
}
}
//检查扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"));
return;
}
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
try{
File uploadedFile = new File(savePath, newFileName);
//处理图片的时候
if(bg_src != null){//上传的文件是图片的时候
FileOutputStream fos = new FileOutputStream(uploadedFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
encoder.encode(tag);
fos.close();
}else{//不是图片还是执行以前的逻辑
item.write(uploadedFile);
}
//映射参数
final String sftpDirName = dirName;
final File sftpUploadedFile = uploadedFile;
final String sftpNewFileName = newFileName;
final String sftpDirType = dirType;
new Thread(){
boolean sortDirExists = true;//文件类型目录
boolean dirIsExists = true;//日期目录
boolean typeDirExists = true;//所属项目目录区分
public void run(){
try{
//sftp code start
//通过sftp方式往服务器指定目录写文件
ChannelSftp sftp = SFTPUtil.connect(hostIp, hostPort, userName, password);
if(sftp != null){
sftp.cd(hostDistinctDir);
//项目区分
try{
sftp.cd(sftpDirType);
}catch(Exception e){
typeDirExists = false;
}
if(!typeDirExists){
sftp.mkdir(sftpDirType);
typeDirExists = true;
sftp.cd(sftpDirType);
}
//文件类型区分
try{
sftp.cd(sftpDirName);
}catch(Exception e){
sortDirExists = false;
}
if(!sortDirExists){
sftp.mkdir(sftpDirName);
sortDirExists = true;
sftp.cd(sftpDirName);
}
//日期目录
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
String ym = sdf2.format(new Date());
try {
sftp.cd(ym);
} catch (Exception e) {
//出现异常说明文件在服务器上不存在
dirIsExists = false;
}
if(!dirIsExists) {
sftp.mkdir(ym);
dirIsExists = true;
}
//调用文件上传
SFTPUtil.upload(hostDistinctDir+sftpDirType+"/"+sftpDirName+"/"+ym, new FileInputStream(sftpUploadedFile), sftpNewFileName, sftp);
SFTPUtil.disconnect(sftp);
}
//sftp code end
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}catch(Exception e){
out.println(getError("上传文件失败。"));
return;
}
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", saveUrl + newFileName);
out.println(obj.toJSONString());
}
}
%>
<%!
private String getError(String message) {
JSONObject obj = new JSONObject();
obj.put("error", 1);
obj.put("message", message);
return obj.toJSONString();
}
%>