`
eric.zhang
  • 浏览: 124029 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

dwz+jquery+fileupload+springmvc实现文件上传 及图片预览

阅读更多
1 前台jsp:文件的上传利用了iframe实现局部刷新功能。使用了apache的fileupload组件,用到的jar: commons-fileupload.jar,commons-io.jar
DiskFileItemFactory fac = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fac);
upload.setHeaderEncoding("utf-8");




JSP页面:
   <%@ page contentType="text/html;charset=UTF-8" %>
<%@page import="com.pdcss.bmxxfb.model.*" %>
<%@ include file="/commons/taglibs.jsp" %>
<style>
.perview {width:200px;background:#fff;font-size:12px; border-collapse:collapse;}
.perview td, .perview th {padding:0px;border:0px;}
.perview th {background-color:#f0f0f0; height:20px;}
.perview a:link, .perview a:visited, .perview a:hover, .perview a:active {color:#00F;}
.perview table{ width:100%;border:1px solid #ccc;border-collapse:collapse;}
</style>
<script type="text/javascript" src="${ctx}/scripts/imgPreview/CJL.0.1.min.js"></script>
<script type="text/javascript" src="${ctx}/scripts/imgPreview/QuickUpload.js"></script>
<script type="text/javascript" src="${ctx}/scripts/imgPreview/ImagePreviewd.js"></script>
<script type="text/javascript">
<!--
	//处理文件上传后的回调,如果成功,则关闭当前窗口,刷新index
	function callback(flag,msg){
		if(flag=='true'){
			$("#pdtpNewForm").parent().parent().hide();
			navTab.reload('/bmxxfb/wzxxfbpdtp/manager');
		}else{
			alert(msg);
		}
	}
	//提交之前检查各字段
	function checkPdtpSubmit(){
		var zzdm = $("#pdtpNewForm #zzdm");
		if(zzdm.val().trim() ==""){
			alert("组织代码不能为空!"); 
			zzdm.focus();
			return false;
		}
		var bmdm = $("#pdtpNewForm #bmdm");
		if(bmdm.val().trim() ==""){
			alert("组织代码不能为空!"); 
			bmdm.focus();
			return false;
		}
		var tpbt = $("#pdtpNewForm #tpbt");
		if(tpbt.val().trim() ==""){
			alert("飘动主题不能为空!"); 
			tpbt.focus();
			return false;
		}
		var tplj = $("#pdtpNewForm #tplj");
		if(tplj.val().trim() ==""){
			alert("链接地址不能为空!"); 
			tplj.focus();
			return false;
		}
		var imgFile = $("#pdtpNewForm #imgFile");
		if(imgFile.val().trim() ==""){
			alert("图片不能为空"); 
			imgFile.focus();
			return false;
		}
        var extStart=imgFile.val().lastIndexOf("."); 
        var ext=imgFile.val().substring(extStart,imgFile.val().length).toLowerCase(); 
        if(ext!=".bmp"&&ext!=".png"&&ext!=".gif"&&ext!=".jpg"&&ext!=".jpeg"){ 
        	alert("图片限于bmp,png,gif,jpeg,jpg格式");
        	imgFile.focus(); 
        	return false; 
        } 
        var regl=/^\+?[1-9][0-9]*$/;
        var kd = $("#pdtpNewForm #kd");
		if(!regl.test(kd.val())){
			alert("宽度应该为正整数!");
			kd.focus();
			return false;
		}
		if(parseInt(kd.val())>225){
			alert("宽度不能超过225!");
			kd.focus();
			return false;
		}
		var gd = $("#pdtpNewForm #gd");
		if(!regl.test(gd.val())){
			alert("宽度应该为正整数!");
			gd.focus();
			return false;
		}
		if(parseInt(gd.val())>200){
			alert("高度不能超过200!");
			gd.focus();
			return false;
		}
		return true;
	}
	function changeValue(flag){
		if(flag=='kd'){
			$("#pdtpNewForm #kd").val($("#kd_tem").val());
		}
		if(flag == 'gd'){
			$("#pdtpNewForm #gd").val($("#gd_tem").val());
		}
	}
	var ip = new ImagePreview( $$("imgFile"), $$("idImg"),{
	maxWidth: 225, maxHeight: 170, action: "viewImg.jsp"
	});
	ip.img.src = ImagePreview.TRANSPARENT;
	ip.file.onchange = function(){
		var imgFile = $("#pdtpNewForm #imgFile");
		if(imgFile.val().trim() ==""){
			alert("图片不能为空"); 
			imgFile.focus();
			return false;
		}
        var extStart=imgFile.val().lastIndexOf("."); 
        var ext=imgFile.val().substring(extStart,imgFile.val().length).toLowerCase(); 
        if(ext!=".bmp"&&ext!=".png"&&ext!=".gif"&&ext!=".jpg"&&ext!=".jpeg"){ 
        	alert("图片限于bmp,png,gif,jpeg,jpg格式");
        	imgFile.focus(); 
        	return false; 
        } 
		ip.preview(); 
		$("#idImg").attr("src","data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==");
	};
	$(document).ready(function(){
		$("#idImg").attr("src","data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==");
	});
//-->
</script>

	<form:form method="post" action="${ctx}/wzxxfbpdtp/save" target="hidden_frame" id="pdtpNewForm" enctype="multipart/form-data" modelAttribute="wzXxfbPdtp">
		<div class="pageContent" layoutH="30">
		<div class="pageFormContent" align="center" style="overflow: hidden;">
			<input type="hidden" id="pkid" name="pkid" value="${wzXxfbPdtp.pkid}"/>
			<input type="hidden" name="imgPath" id="imgPath" />
			<input type="hidden" name="testH" value="testH">
			<table align="center" width="500px" height="300px" border="0" cellpadding="0" cellspacing="0" style="margin-top: 10px;text-align: center;border-spacing: 10px;">
				<tr>
					<td align="right" width="70px">
						<%=WzXxfbPdtp.ALIAS_ZZDM%>:
					</td>
					<td width="120px">
						<form:input path="zzdm" id="zzdm" size="25" readonly="true" value="${zzdm }" maxlength="50" />
					</td>
					<td width="225px" rowspan="6">
						<table border="0"  cellpadding="0" cellspacing="0">
							<tr><th bgcolor="#f0f0f0" style="line-height: 25px;"><center>预览图</center></th></tr>
							<tr>
								<td>
									<div style="width: 225px;height: 170px;border:1px solid #99BBE8">
										<table border="0" class="perview">
											<tr>
												<td align="center"><img id="idImg"/></td>
											</tr>
										</table>
									</div>
								</td>
							</tr>
						</table>
					</td>
				</tr>
				<tr>
					<td width="70px">
						<label for="bmdm"><%=WzXxfbPdtp.ALIAS_BMDM%>:</label>
					</td>
					<td width="120px">
						<form:input path="bmdm" id="bmdm" size="25" readonly="true" value="${bmdm }" maxlength="50" />
					</td>
				</tr>
				<tr>
					<td width="70px">
						<label for="tpbt"><%=WzXxfbPdtp.ALIAS_TPBT%>:</label>
					</td>
					<td width="120px">
						<form:input path="tpbt" id="tpbt" size="25"  cssClass="required" maxlength="100" />
					</td>
				</tr>
				<tr>
					<td width="70px">
						<label for="tplj"><%=WzXxfbPdtp.ALIAS_TPLJ%>:</label>
					</td>
					<td width="120px">
						<form:input path="tplj" id="tplj" size="25"  cssClass="required" maxlength="1000" />
					</td>
				</tr>
				<tr>
					<td width="70px">
						图片宽高:
					</td>
					<td width="120px">
						<table>
							<tr>
								<td>
									<input id="kd_tem" name="kd_tem" value="160" onchange="javascript:changeValue('kd');" size="8" maxlength="4">
									<input type="hidden" id="kd" name="kd" value="160">
								</td>
								<td>&nbsp;&nbsp;单位(px)</td>
							</tr>
						</table>
					</td>
				</tr>
				<tr>
					<td width="70px">
						<label for="gd"><%=WzXxfbPdtp.ALIAS_GD%>:</label>
					</td>
					<td width="120px">
						<table>
							<tr>
								<td>
									<input id="gd_tem" name="gd_tem" value="100" size="8" maxlength="4" onchange="javascript:changeValue('gd');">
									<input type="hidden" id="gd" name="gd" value="100">
								</td>
								<td>&nbsp;&nbsp;单位(px)</td>
							</tr>
						</table>
					</td>
				</tr>
				<tr>
					<td colspan="2" width="190px">
						<label for="sfpd"><%=WzXxfbPdtp.ALIAS_SFPD%>:</label>
						<label><input type="radio"  name="sfpd" value="1" checked="checked">飘动</label>
						<label><input type="radio"  name="sfpd" value="0">不飘动</label>
					</td>
					<td><font color="red">只允许上传1M内jpg,jpeg,gif,png格式图片</font></td>
				</tr>
				<tr>
					<td width="70px">选择图片</td>
					<td colspan="2"><input id="imgFile" name="imgFile" type="file" /></td>
				</tr>
			</table>
		</div>
		</div>
		<iframe name="hidden_frame" id="hidden_frame" src="message.html" style="display:none"></iframe>
		<div class="formBar">
			<ul>
				<li>
					<div class="buttonActive"><div class="buttonContent"><button type="submit"  onclick="return checkPdtpSubmit();">保存</button></div></div>
				</li>
				<li>
					<div class="button"><div class="buttonContent"><button type="button" class="close">关闭</button></div></div>
				</li>
			</ul>
		</div>
	</form:form>



2 后台Controller

import java.io.File;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javacommon.base.BaseRestSpringController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import cn.org.rapid_framework.page.Page;
import cn.org.rapid_framework.web.scope.Flash;

import com.common.consts.StaticDict;



/**
 * @author pdcss
 * 这里是控制层,用于编写页面跳转控制,容器变量管理,JavaBean收集传递的代码
 * 严禁出现 SQL,HQL,HTML,JS,CSS代码
 * 可以将其他service层注入这里,但严禁将dao层注入这里

 *
 */
@Controller
@RequestMapping("/wzxxfbpdtp")
public class WzXxfbPdtpController extends BaseRestSpringController<WzXxfbPdtp,java.lang.String>{
	//默认多列排序,example: username desc,createTime asc
	protected static final String DEFAULT_SORT_COLUMNS = ""; 
	private WzXxfbPdtpManager wzXxfbPdtpManager;
	private final String LIST_ACTION = "redirect:/wzxxfbpdtp/manager";
	
	/** 
	 * 增加setXXXX()方法,spring就可以通过autowire自动设置对象属性,注意大小写

	 **/
	public void setWzXxfbPdtpManager(WzXxfbPdtpManager manager) {
		this.wzXxfbPdtpManager = manager;
	}
	
	/** binder用于bean属性的设置 */
	@InitBinder  
	public void initBinder(WebDataBinder binder) {  
	        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));  
	}
	   
	/**
	 * 增加了@ModelAttribute的方法可以在本controller方法调用前执行,可以存放一些共享变量,如枚举值,或是一些初始化操作
	 */
	@ModelAttribute
	public void init(ModelMap model) {
		model.put("now", new java.sql.Timestamp(System.currentTimeMillis()));
		/**
		 * 读入静态字典
		 */
		StaticDict.fillMapAll(model);
	}
	/**
	 * 初始化新增,修改,查询列表页面数据
	 * @param model
	 */
	public void initAddAndUpdate(ModelMap model) {
	}	


	/** 保存新增,@Valid标注spirng在绑定对象时自动为我们验证对象属性并存放errors在BindingResult  */
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/save")
	public String create(ModelMap model,@Valid WzXxfbPdtp wzXxfbPdtp,HttpServletRequest request,HttpServletResponse response)throws Exception  {
		DiskFileItemFactory fac = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(fac);
		upload.setHeaderEncoding("utf-8");
		List fileList=null;
		try {
			fileList = upload.parseRequest(request);
		} catch (FileUploadException e1) {
			e1.printStackTrace();
		}
		//根路径
		String root=request.getSession().getServletContext().getRealPath("");
		//图片保存完整路径
		String savePath = root+File.separator+"pdtpFolder"+File.separator;
		File f1 = new File(savePath);
		if (!f1.exists()) {
			f1.mkdirs();
		}
		//图片名称
		String name = "";
		//新生成的图片名称
		String newName = "";
		//扩展名
		String extName = "";
		String message = "";
		boolean flag = true;
		Iterator<FileItem> it = fileList.iterator();
		while (it.hasNext()) {
			FileItem item = it.next();
			//给取表单域的值,赋给wzXxfbPdtp对象
			setFormFields(wzXxfbPdtp, item);
			// 如果是文件类型字段
			if (!item.isFormField()) {
				name = item.getName();
				long size = item.getSize();
				if(size>(1024*1024)){
					message="文件"+item.getName()+"大超过了1M,上传失败!";
					break;
				}
				// 扩展名格式:
				if (name.lastIndexOf(".") >= 0) {
					extName = name.substring(name.lastIndexOf("."));
				}
				// 定义允许上传的文件类型
				List<String> fileTypes = new ArrayList<String>();
				fileTypes.add(".jpg");
				fileTypes.add(".jpeg");
				fileTypes.add(".gif");
				fileTypes.add(".png");
				if(!fileTypes.contains(extName.toLowerCase())){
					message = "只允许上传jpg,jpeg,gif,png格式的图片";
					flag = false;
				}
				if(flag) {
					DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ssSSS");
					Calendar calendar = Calendar.getInstance();
					//以当前时间为文件名 格式如:2011-09-03-19-30-36047 
					newName = df.format(calendar.getTime());
					//name = UUID.randomUUID().toString();
					File newFile = new File(savePath + newName + extName);
					item.write(newFile);
					message="上传文件"+item.getName()+"成功";
					model.addAttribute("successFileName",newName + extName);
					//设置图片的相对地址
					wzXxfbPdtp.setTpdz("pdtpFolder/"+newName+extName);
					//图片原名称
					wzXxfbPdtp.setTpmc(name);
				} 
			}
		}
		wzXxfbPdtpManager.save(wzXxfbPdtp);
//		dwzCallback(model,CREATED_SUCCESS);
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.write("<script>parent.callback('"+flag+"','"+message+"')</script>");
//		return LIST_ACTION;
		return null;
	}
	
	
	/** 保存更新,@Valid标注spirng在绑定对象时自动为我们验证对象属性并存放errors在BindingResult  */
	@SuppressWarnings("unchecked")
	@RequestMapping(value="/{id}/update",method=RequestMethod.POST)
	public String update(ModelMap model,@PathVariable java.lang.String id,@Valid WzXxfbPdtp wzXxfbPdtp,BindingResult errors,HttpServletRequest request,HttpServletResponse response) throws Exception {
		DiskFileItemFactory fac = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(fac);
		upload.setHeaderEncoding("utf-8");
		List fileList=null;
		try {
			fileList = upload.parseRequest(request);
		} catch (FileUploadException e1) {
			e1.printStackTrace();
		}
		String root=request.getSession().getServletContext().getRealPath("");
		String savePath = root+File.separator+"pdtpFolder"+File.separator;
		File f1 = new File(savePath);
		if (!f1.exists()) {
			f1.mkdirs();
		}
		String name = "";
		String newName = "";
		String extName = "";
		String message = "";
		//修改之前 图片地址
		String oldFilePath = "";
		boolean flag = true;
		wzXxfbPdtp.setPkid(id);
		Iterator<FileItem> it = fileList.iterator();
		while (it.hasNext()) {
			FileItem item = it.next();
			setFormFields(wzXxfbPdtp, item);
			if(item.isFormField()){
				String field = item.getFieldName();
				if(field.equals("oldFilePath")){
					oldFilePath = item.getString("utf-8");
					wzXxfbPdtp.setTpdz(oldFilePath);
				}
				if(field.equals("tpmc")){
					wzXxfbPdtp.setTpmc(item.getString("utf-8"));
				}
			}
			if (!item.isFormField()) {
				name = item.getName();
				if(name != null && !"".equals(name)){
					long size = item.getSize();
					if(size>(1024*1024)){
						message="文件"+item.getName()+"大超过了1M,上传失败!";
						break;
					}
					// 扩展名格式:
					if (name.lastIndexOf(".") >= 0) {
						extName = name.substring(name.lastIndexOf("."));
					}
					// 定义允许上传的文件类型
					List<String> fileTypes = new ArrayList<String>();
					fileTypes.add(".jpg");
					fileTypes.add(".jpeg");
					fileTypes.add(".gif");
					fileTypes.add(".png");
					if(!fileTypes.contains(extName.toLowerCase())){
						message = "只允许上传jpg,jpeg,gif,png格式的图片";
						flag = false;
					}
					if(flag) {
						DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ssSSS");
						Calendar calendar = Calendar.getInstance();
						//以当前时间为文件名 格式如:2011-09-03-19-30-36047 
						newName = df.format(calendar.getTime());
						//name = UUID.randomUUID().toString();
						File newFile = new File(savePath + newName + extName);
						item.write(newFile);
						message="上传文件"+item.getName()+"成功";
						model.addAttribute("successFileName",newName + extName);
						//设置图片的相对地址
						wzXxfbPdtp.setTpdz("pdtpFolder/"+newName+extName);
						//图片原名称
						wzXxfbPdtp.setTpmc(name);
					} 
				}
			}
		}
		wzXxfbPdtpManager.update(wzXxfbPdtp);
		if(name != null && !"".equals(name) && flag == true){
			File oldImg = new File(root+File.separator+oldFilePath);
			if(oldImg.exists()){
				oldImg.delete();
			}
		}
	//	dwzCallback(model,UPDATE_SUCCESS);
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.write("<script>parent.callbackEdit('"+flag+"','"+message+"')</script>");
	//	return LIST_ACTION;
		return null;
	}
	/*
	 * 因为前台Form表单的 enctype="multipart/form-data",不能再通过request.getParameter()来取得参数,只能通过以下的方法:取得Form表单各文本域的值,赋给wzXxfbPdtp对象
	 */
	private void setFormFields(WzXxfbPdtp wzXxfbPdtp, FileItem item) throws UnsupportedEncodingException {
		if(item.isFormField()){
			String field = item.getFieldName();
			if(field.equals("zzdm")){
				String zzdm = item.getString("utf-8");
				wzXxfbPdtp.setZzdm(zzdm);
			}
			if(field.equals("bmdm")){
				String bmdm = item.getString("utf-8");
				wzXxfbPdtp.setBmdm(bmdm);
			}
			if(field.equals("tpbt")){
				String tpbt = item.getString("utf-8");
				wzXxfbPdtp.setTpbt(tpbt);
			}
			if(field.equals("tplj")){
				String tplj = item.getString("utf-8");
				wzXxfbPdtp.setTplj(tplj);
			}
			if(field.equals("kd")){
				String kd = item.getString("utf-8");
				wzXxfbPdtp.setKd(Integer.parseInt(kd));
			}
			if(field.equals("gd")){
				String gd = item.getString("utf-8");
				wzXxfbPdtp.setGd(Integer.parseInt(gd));
			}
			if(field.equals("sfpd")){
				String sfpd = item.getString("utf-8");
				wzXxfbPdtp.setSfpd(sfpd);
			}
		}
	}
	
	/** 删除 */
	@RequestMapping(value = "/{id}/delete")
	public String delete(ModelMap model,@PathVariable java.lang.String id,HttpServletRequest request) {
		WzXxfbPdtp pdtp = wzXxfbPdtpManager.getById(id);
		String path = pdtp.getTpdz();
		//得到图片存放的完整路径
		String folder =  path.substring(0, path.lastIndexOf("/"));
		//得到图片的名称
		String name =  path.substring(path.lastIndexOf("/")+1);
		//得到图片存放的完整路径
		String savePath = request.getSession().getServletContext().getRealPath("")+File.separator+folder+File.separator+name;
		wzXxfbPdtpManager.removeById(id);
		File f1 = new File(savePath);
		if(f1.exists()){
			f1.delete();
		}
		dwzCallback(model,DELETE_SUCCESS);
		return LIST_ACTION;
	}

	/** 批量删除 */
	@RequestMapping(value = "/batchDeletes")
	public String batchDelete(ModelMap model,@RequestParam("items") String items,HttpServletRequest request) {
		String[] arr_items = items.split(",");
		WzXxfbPdtp pdtp = null;
		for(int i = 0; i < arr_items.length; i++) {
			pdtp = wzXxfbPdtpManager.getById(arr_items[i]);
			wzXxfbPdtpManager.removeById(arr_items[i]);
			String path = pdtp.getTpdz();
			//得到图片存放的完整路径
			String folder =  path.substring(0, path.lastIndexOf("/"));
			//得到图片的名称
			String name =  path.substring(path.lastIndexOf("/")+1);
			//得到图片存放的完整路径
			String savePath = request.getSession().getServletContext().getRealPath("")+File.separator+folder+File.separator+name;
			File f1 = new File(savePath);
			if(f1.exists()){
				f1.delete();
			}
		}
		dwzCallback(model,DELETE_SUCCESS);
		return LIST_ACTION;
	}
	/**
	 * DWZ 回调函数,封装了操作的结果
	 * 
	 * @param status
	 */
	public void dwzCallback(ModelMap model,String status){
		if(CREATED_SUCCESS.equals(status) || UPDATE_SUCCESS.equals(status) || DELETE_SUCCESS.equals(status) ){
			Flash.current().success(status); //存放在Flash中的数据,在下一次http请求中仍然可以读取数据,error()用于显示错误消息
			/**
			 * statusCode 200:成功 300:失败 301:
			 */
			model.addAttribute("statusCode", "200");
			/**
			 * 返回后需要刷新的 tab 的ID ,如不填写则不刷新
			 */
			model.addAttribute("navTabId", "BM01040000");
			/**
			 * 返回后需要调用的 js 方法, closeCurrent: 关闭当前tab页(一般用于在tab页打开的新增,编辑页面)
			 */
			if(! DELETE_SUCCESS.equals(status)){
				model.addAttribute("callbackType", "closeCurrent");
			}
			/**
			 * 返回后提示栏显示的信息

			 */
			model.addAttribute("message", status);
		}
	}
}




图片预览需要用到的js:
CJL.0.1.min.js
ImagePreviewd.js
QuickUpload.js

3下面是实现图片预览的servlet


package com.common.controller;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import sun.misc.BASE64Encoder;
import javax.imageio.*;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.DeferredFileOutputStream;
import org.apache.log4j.Logger;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;


public class ImagePreview {
	private final static Logger LOGGER = Logger.getLogger(ImagePreview.class);
	public ImagePreview(){
		
	}
	
	public String ProcessRequest(HttpServletRequest request) throws ServletException, IOException{
		BASE64Encoder encoder = new BASE64Encoder();
		
		byte[] bs = null;
		long filesize = 0;
		
		DiskFileItemFactory factory = new DiskFileItemFactory();
		
		int width = 0;
		int height = 0;
		
		InputStream inputStream = null;
		ByteArrayOutputStream op = null;
		DeferredFileOutputStream dfo = null;
		
		try{
			factory.setSizeThreshold(4096);// 设置缓冲,这个值决定了是fileinputstream还是bytearrayinputstream
			//factory.setRepository(new File("d:\\temp"));//设置临时存放目录,默认是new File(System.getProperty("java.io.tmpdir"))
			ServletFileUpload sfileUpLoad = new ServletFileUpload(factory);
			sfileUpLoad.setSizeMax(1*1024*1024);//1M
			List items = sfileUpLoad.parseRequest(request);
			Iterator it = items.iterator();
			//暂时只考虑单文件
			while(it.hasNext()){
				FileItem fileItem = (FileItem)it.next();
				if(!fileItem.isFormField()){
					inputStream = fileItem.getInputStream();
					filesize = fileItem.getSize();
					bs = new byte[(int)filesize];
					
				}else{
					if (fileItem.getFieldName().equals("width")) {
						dfo = (DeferredFileOutputStream) fileItem.getOutputStream();
						width = Integer.parseInt(new String(dfo.getData()));
					}
					if (fileItem.getFieldName().equals("height")) {
						dfo = (DeferredFileOutputStream) fileItem.getOutputStream();
						height = Integer.parseInt(new String(dfo.getData()));
					}
				}
			}
			
			op = ResizeImg(inputStream, width, height);
			
			bs = op.toByteArray();
			
			String imgpath = "data:image/jpeg;base64," ;
			String img = encoder.encode(bs);
			
			imgpath += img;
			
			return imgpath;
		}catch (FileUploadException e) {
			e.printStackTrace();
			LOGGER.error(e);
		} catch (IOException e) {
			e.printStackTrace();
			LOGGER.error(e);
		}finally{
			if(dfo != null){
				dfo.close();
			}
			if(inputStream != null){
				inputStream.close();
			}
			if(op!= null){
				op.close();
			}
		}
		
		//blankimage
		return "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
		
	}
	
	//只对jpg缩放
	public ByteArrayOutputStream ResizeImg(InputStream inputStream,int maxWidth,int maxHeight) throws IOException{
		
		BufferedImage bufferimage = ImageIO.read(inputStream);
		int curWidth = bufferimage.getWidth();
		int curHeight = bufferimage.getHeight();
		
//		double desiredRatio = Math.min((double)(maxWidth)/(double)curWidth,(double)maxHeight/(double)curHeight);
//		curWidth =  (int) (curWidth*desiredRatio);
//		curHeight = (int)(curHeight*desiredRatio);
		double ratio = 0; 
		Image itemp = bufferimage.getScaledInstance(maxWidth, maxHeight, bufferimage.SCALE_SMOOTH);      
        // 计算比例      
        if ((bufferimage.getHeight() > maxHeight) || (bufferimage.getWidth() > maxWidth)) {      
            if (bufferimage.getHeight() > bufferimage.getWidth()) {      
                ratio = (new Integer(maxHeight)).doubleValue() / bufferimage.getHeight();      
            } else {      
                ratio = (new Integer(maxWidth)).doubleValue() / bufferimage.getWidth();      
            }      
            AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);      
            itemp = op.filter(bufferimage, null);      
        }
        
		
		BufferedImage bufftmp = new BufferedImage(curWidth,curHeight,BufferedImage.TYPE_INT_RGB);
		Graphics2D g2D = bufftmp.createGraphics();
		
		g2D.setColor(Color.white);
		g2D.fillRect(0, 0, curWidth, curHeight);
//		g2D.drawImage(bufferimage, null, 0, 0);
		
		if (maxWidth == itemp.getWidth(null))      
			g2D.drawImage(itemp, 0, (maxHeight - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);      
        else     
        	g2D.drawImage(itemp, (maxWidth - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);      
		g2D.dispose();      
//        itemp = bufftmp;
		
		ByteArrayOutputStream op = new ByteArrayOutputStream();
		
		JPEGImageEncoder imageEncoder = JPEGCodec.createJPEGEncoder(op);
		
		imageEncoder.encode((BufferedImage)itemp);
		
		return op;
	}
	

}


viewImg.jsp:
<%@ page language="java"  pageEncoding="UTF-8"%>
<%@page import="com.common.controller.ImagePreview;"%>
<%
ImagePreview img = new ImagePreview();
out.write(img.ProcessRequest(request));
%>



下面是截图:


  • 大小: 64.7 KB
分享到:
评论
4 楼 eric.zhang 2012-10-08  
jieAmei 写道
能给我发一下这个代码吗?谢谢,452909926@qq.com

关键的代码我都已经贴出来了,就上面的这些,其他的源代码,我现在也没有了。不好意思。
3 楼 jieAmei 2012-09-19  
能给我发一下这个代码吗?谢谢,452909926@qq.com
2 楼 zhanghj819 2012-07-26  
能给我发一下这个代码吗?谢谢,184040434@QQ.com
1 楼 logoc 2012-02-19  
能给我发一下这个代码吗?谢谢,liliang_well@126.com

相关推荐

Global site tag (gtag.js) - Google Analytics