`
HotStrong
  • 浏览: 509149 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Struts2 图片上传、缩放、剪切处理 第二节

阅读更多

Struts2 图片上传、缩放、剪切处理 第一节

 

Struts2 图片上传、缩放、剪切处理 第二节

 

1、技术目标:

 

  • 对上传的图片进行缩放、剪切操作

 

提示:本文示例项目已提供下载



2、处理流程:

1)在影片列表页面(films.jsp)点"修改"进入影片修改页面,如图:

 

 

2)在影片修改页面(update.jsp)中双击图片,进入图片缩放、剪切处理页面(imgscissor.jsp),如图,

 

update.jsp效果图:

 

 

imgscissor.jsp效果图:

 

 

3)在imgscissor.jsp页面中设置图片的缩放宽度、高度,如图,

 

提示:影片"刀见笑"海报图片原有尺寸为92(宽)*130(高),压缩为60 * 100

 

压缩前效果图:

 

4)在imgscissor.jsp页面中使用jQuery图片剪切插件"imgAreaSelect"对图片进行剪切操作,如图,

 

剪切前效果图:

 

 

5)采用ajax方式将图片的缩放、剪切参数提交给Action进行处理

6)服务器Action根据页面设置的参数对图片进行如下处理:

 

  • 采用java-image-scaling-0.8.5.jar提供的功能对图片进行缩放处理
  • 采用javax.imageio以及java.awt提供的功能对图片进行剪切处理

 

7)用处理好的图片替换原有的图片,服务器Action返回处理结果,页面提示处理结果并显示处理后的图片,如图,

 

压缩后效果图:

 

 

剪切后效果图:

 

 

注意:第二步、第三步处理可同时进行

 

 

3、使用准备

 

3.1)站点根路径下创建js文件夹,导入如下js、css文件:

 

jquery.js         版本:v1.4.2

jquery.tooltip.css jQuery信息提示插件样式

jquery.tooltip.js jQuery信息提示插件

jquery.form.js jQuery表单插件

loading.gif         进度提示图片

jquery.loadmask.css jQuery窗口屏蔽插件样式

jquery.loadmask.js jQuery窗口屏蔽插件

 

3.2)导入jQuery插件imgareaselect

 

在js文件夹下创建文件夹imgareaselect,imgareaselect下再创建css文件夹,imgareaselect下导入如下文件:

 

jquery.imgareaselect.jsjQuery图片剪切插件

 

imgareaselect/css下导入如下文件(图片剪切插件所选样式与图片素材):

 

border-anim-h.gif

border-anim-v.gif

border-h.gif

border-v.gif

imgareaselect-animated.css

imgareaselect-default.css

imgareaselect-deprecated.css

 

提示:imgareaselect插件的详细信息可访问

http://odyniec.net/projects/imgareaselect/examples.html#fixed-aspect-ratio

 

3.3)导入相关的jar包

 

gson-1.5.jar将Java对象转换成JSON

java-image-scaling-0.8.5.jar图片压缩工具

 

提示:对gson的使用有兴趣的可参看

http://hotstrong.iteye.com/blog/1164379



4、给影片修改页面(update.jsp)加入如下两处代码

 

注意:图片的缩放、剪切操作将从update.jsp开始

 

4.1)导入相关js、css文件

 

 

<link rel="stylesheet" href="<%=basePath %>/js/jquery.tooltip.css" type="text/css"/>
<script type="text/javascript" src="<%=basePath %>/js/jquery.js"></script>
<script type="text/javascript" src="<%=basePath %>/js/imgscissor.js"></script>
<script type="text/javascript" src="<%=basePath %>/js/jquery.tooltip.js"></script>

 

 

 

提示:imgscissor.js将在后续创建

 

4.2)为img标签加入scissor类样式,如下:

 

 

<img src="<s:property value="imgurl" />" class="scissor" width="92" height="130" 
onerror="javascript:this.src='<%=basePath %>/images/error.gif'" /><br />

 

 

 

修改后的update.jsp如下:

 

 

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" %>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>修改影片</title>
    <link rel="stylesheet" href="<%=basePath %>/js/jquery.tooltip.css" type="text/css"/>
    <script type="text/javascript" src="<%=basePath %>/js/jquery.js"></script>
    <script type="text/javascript" src="<%=basePath %>/js/imgscissor.js"></script>
    <script type="text/javascript" src="<%=basePath %>/js/jquery.tooltip.js"></script>
  </head>
  <body>
    <s:form action="/film/updateFilm" method="post" enctype="multipart/form-data">
    	<s:hidden name="id" />
    	影片名称:<s:textfield name="fname" /><br />
    	<%-- 处理原有图片 --%>
    	<s:if test='imgurl != null and imgurl != ""'>
    		<%-- 保存原有图片的信息在修改时提交 --%>
			<s:hidden name="imgurl"></s:hidden>
			<%-- 显示原有图片,onerror属性:在打不开图片时显示提示图片 --%>
			<img src="<s:property value="imgurl" />" class="scissor" width="92" height="130" 
			 onerror="javascript:this.src='<%=basePath %>/images/error.gif'" /><br />
		</s:if>
    	<%--文件选择框 --%>
    	影片海报:<s:file id="imgPhoto" name="imgPhoto"/><br />
    	<s:submit value=" 修改 "></s:submit>
    </s:form>
  </body>
</html>

 

 

 

5、在js文件夹下创建imgscissor.js,用于处理"双击图片"向Action提交请求并进入图片缩放、剪切页面,代码如下:

 

 

$(document).ready(function() {
	
        //获取JS文件当前路径并设置站点绝对路径
        var CurrentJsPath = (function (){
	        var k = document.getElementsByTagName("script");
	        srcStr = k[0].getAttribute("src");
	        //截取出站点路径
	        srcStr = srcStr.substring(0, srcStr.indexOf("/js/"));
	        return srcStr; 
        })();
	
	/*
	 * 创建表单,该表单访问ImageScissorAction并将两个参数传过去
	 * 参数:proportion	裁剪比例(一般的处理要求等比例裁剪)
	 * 参数:originPath	图片url路径
	 */
	$('body').append('<form id="toScissrorForm" action="' + CurrentJsPath + 'film/toScissor" method="post">' + 
			'<input type="hidden" name="proportion" value="" />' + 
			'<input type="hidden" name="originPath" value="" /> </form>');
	$('#toScissrorForm').hide();
	
	//为样式为scissor的元素(img标签)加入处理
	$('.scissor').each(function() {
		
		//获取标签的src属性值(图片的url)并加入一个参数(当前时间)以防止缓存
		var imgPath = $(this).attr('src') + '?' + new Date().getTime();
		
		//将带时间参数的url再设置给图片的src属性
	    $(this).attr('src',imgPath);
	    
	    //设置鼠标移到图片上的提示文字
	    $(this).tooltip({
			showURL: false,
			bodyHandler: function() {
				return '双击裁剪图片';
			}
		});
	    
	    //设置图片的双击事件处理
	    $(this).dblclick(function(){
	    	
	    	//获取img标签的src值(url路径)
			var imageSrc = $(this).attr('src');
			
			//读取img的宽、高
			var width = $(this).attr("width");
			var height = $(this).attr("height");
			//设置拖拽比例(裁剪图片应该按比例裁剪)
			var proportion = width + ":" + height;
			
			//将值设置给表单
			$('#toScissrorForm input[name=originPath]').val(imageSrc);
			$('#toScissrorForm input[name=proportion]').val(proportion);
			$('#toScissrorForm').submit();//双击提交表单
		});
	    
	  });
	
});

 

 

 

6、在manager文件夹下创建jsp文件imgscissor.jsp(图片压缩、剪切操作页面),压缩、剪切操作完成后将参数异步发送给ImageScissorAction,代码如下:

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<% 
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path; 
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>图片裁剪页面</title>

<!-- 导入插件样式 -->
<link rel="stylesheet"	
href="<%=basePath %>/js/imgareaselect/css/imgareaselect-animated.css" type="text/css" />
<link rel="stylesheet" href="<%=basePath %>/js/jquery.tooltip.css" type="text/css"/>
<link href="<%=basePath %>/js/jquery.loadmask.css" rel="stylesheet" type="text/css" />

<!-- 设置图片操作DIV的样式 -->
<style type="text/css">

#imgDiv{

	margin-left: 3px; margin-top: 5px; width: 800px; height: 700px;
	overflow: auto;
	scrollbar-3dlight-color:#595959; 
	scrollbar-arrow-color:#FFFFFF; 
	scrollbar-base-color:#CFCFCF; 
	scrollbar-darkshadow-color:#FFFFFF; 
	scrollbar-face-color:#CFCFCF; 
	scrollbar-highlight-color:#FFFFFF; 
	scrollbar-shadow-color:#595959;
}

</style>

<!-- 导入jQuery各种插件 -->
<script type="text/javascript" charset="UTF-8" src="<%=basePath %>/js/jquery.js"></script>
<script type="text/javascript" src="<%=basePath %>/js/imgareaselect/jquery.imgareaselect.js"></script>
<script type="text/javascript" src="<%=basePath %>/js/jquery.tooltip.js"></script>
<script type="text/javascript" src="<%=basePath %>/js/jquery.form.js"></script>
<script type="text/javascript" src="<%=basePath %>/js/jquery.loadmask.js"></script>

<script type="text/javascript">

	$(document).ready(function() {

		//获取拖拽比例
		var proportion = $('#proportion').val();

		//unescape可对通过escape()编码的字符串进行解码
		var imagePath = unescape($('#img').attr('src'));

		//图片的url设置给隐藏表单originPath,准备提交给Action
		$('input[name=originPath]').val(imagePath);

		//通过图片的url取出服务器域名全路径并设置好访问Action的url
		var imgPath = $('#img').attr('src');
		var newAction = imgPath.substring(0, imgPath.indexOf('/images')) +"/film/scissor";
		//设置表单的action属性为Action的rul
		$('#scissorForm').attr('action',newAction);
		
		//为id为img的图片设置图片剪切插件
		var imgArea = $('#img').imgAreaSelect({
			
			fadeSpeed: 400,
			handles: true,
	        		instance: true,
	       	 	aspectRatio: proportion, //设置拖拽比例
			onSelectEnd : function(img, selection) {
				$('#areaHeight').html((selection.y2 - selection.y1)+" 像素");
				$('#areaWidth').html((selection.x2 - selection.x1)+" 像素");
				$('input[name=x1]').val(selection.x1);
				$('input[name=y1]').val(selection.y1);
				$('input[name=x2]').val(selection.x2);
				$('input[name=y2]').val(selection.y2);
				$('#warning').hide();
			}
		});
		
		//提交按钮的单击事件处理
		$('#submitBtn').click(function(){

			if(confirm("是否提交?")){
				$('#scissorForm').submit();
			}
			
		});

		//设置表单ajax异步提交
	    $('#scissorForm').submit(function() {
		    		
			        $(this).ajaxSubmit({ 
				        	
			        		beforeSubmit:  function(){//提交前的处理
								
			        			//提交表单处理期间,屏蔽整个窗口        					
			        			$('#content').mask("正在提交数据,请稍候。");
			        			//关闭提交按钮
			        			$('input[name=submit]').attr("disabled", true);
	        				},
			        		dataType:  'json', 
				        	success: function showResponse(responseText, statusText, xhr, $form){ 

					        	//取消窗口屏蔽
	        					$('#content').unmask();
			        			$('#warning').show();

			        			//打开提交按钮
			        			$('input[name=submit]').attr("disabled", false);
			        			
			        			imgArea.cancelSelection();
				        		var imgPath = $('#img').attr('src')+'?'+new Date().getTime();
			        			$('#img').attr('src',imgPath);
			        			
								//重置参数
			        			$('input[name=scaleHeight]').val('');
			        			$('input[name=scaleWidth]').val('');
			        			$('#areaHeight').html('');
			        			$('#areaWidth').html('');
			        			alert(responseText);
					        }
		        	}); 
		        	
			        return false; 
	    }); 

		//返回上一页
	    $('#back').click(function(){
	    	history.go(-1);
		});
		
	});
</script>
</head>

<body>
<div id="content" >
<!-- 保存图片修改后参数的表单 -->
<form id="scissorForm" method="post">

	剪切区域,高:<label id="areaHeight"></label>
	宽:<label id="areaWidth"></label>
	<br /><br />
	
	缩放宽:<input type="text" name="scaleWidth" value="" style="width: 100px;" /> 
	缩放高:<input type="text" name="scaleHeight" value="" style="width: 100px;" />
	<br /><br />
	
	<!-- 提示信息 -->
	<font color="red">[请先选取裁剪区域]&nbsp;[大尺寸图片可先缩放再剪切]</font>
	<br /><br />
	
	<input type="button" id="submitBtn" name="submitBtn" value="提交" />
	<input type="button" id="back"  value="返回" />
	
	<%-- 图片剪切区域 --%>
	<div id="imgDiv">
		<!-- 待处理的图片 -->
		<img id="img" src="<s:property value="originPath" />" class="scissor" alt="点击裁剪图片">
	</div>
	
	<!-- 保存图片操作参数的隐藏表单 -->
	<input type="hidden" name="x1" value="" /> 
	<input type="hidden" name="y1" value="" /> 
	<input type="hidden" name="x2" value="" /> 
	<input type="hidden" name="y2" value="" /> 
	<input type="hidden" name="originPath" value="" /> 
</form>
</div>

<!-- 保存缩放比的隐藏表单 -->
<input type="hidden" id="proportion" name="proportion" 
value="<s:property value="proportion" />" />

</body>
</html>

 

 

 

7、在com.xxx.util包下创建图片处理工具类ImageUtil,提供图片的压缩(scaleImage)、剪切(scissor)处理方法,代码如下:

 

 

package com.xxx.util;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import com.mortennobel.imagescaling.ResampleOp;

/**
 * 图片处理工具类
 *
 */
public class ImageUtil {
	
	/**
	 * 根据传入的图片坐标进行图片截取
	 * 
	 * @param x1 X起点坐标
	 * @param x2 X终点坐标
	 * @param y1 Y起点坐标
	 * @param y2 Y终点坐标
	 * @param originPath 原始图片的存放路径
	 * @param savePath 截取后图片的存储路径
	 * @throws IOException
	 */
	public static void scissor(int x1, int x2, int y1, int y2,
			String originPath, String savePath) throws IOException {
		
		FileInputStream is = null;
		ImageInputStream iis = null;

		try {
			
			// 读取图片文件
			is = new FileInputStream(originPath);

			/*
			 * 返回包含所有当前已注册 ImageReader 的 Iterator,
			 * 这些 ImageReader 声称能够解码指定格式。
			 * 参数:formatName - 包含非正式格式名称 .(例如 "jpeg" 或 "tiff")等 。
			 */
			Iterator<ImageReader> it = ImageIO
					.getImageReadersByFormatName(getExtention(originPath)
							.toLowerCase());
			ImageReader reader = it.next();
			// 获取图片流
			iis = ImageIO.createImageInputStream(is);

			/*
			 * iis:读取源.true:只向前搜索,将它标记为 ‘只向前搜索’。
			 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 
			 * reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
			 */
			reader.setInput(iis, true);

			/*
			 * 描述如何对流进行解码的类,用于指定如何在输入时从 Java Image I/O
			 * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 
			 * 将从其 ImageReader 实现的
			 * getDefaultReadParam方法中返回 ImageReadParam 的实例。
			 */
			ImageReadParam param = reader.getDefaultReadParam();

			/*
			 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
			 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
			 */
			Rectangle rect = new Rectangle(x1, y1, x2 - x1, y2 - y1);

			// 提供一个 BufferedImage,将其用作解码像素数据的目标。
			param.setSourceRegion(rect);

			/*
			 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
			 * BufferedImage 返回。
			 */
			BufferedImage bi = reader.read(0, param);

			// 保存新图片
			ImageIO.write(bi, getExtention(originPath).toLowerCase(), new File(
					savePath));
		} finally {
			if (is != null)
				is.close();
			if (iis != null)
				iis.close();
		}
	}

	/**
	 * 
	 * 缩放图片
	 * 
	 * @param width 宽
	 * @param height 高
	 * @param originPath 原始路径
	 * @param savePath 保存路径
	 * @throws IOException
	 */
	public static void scaleImage(int width, int height, String originPath,
			String savePath) throws IOException {
		
		BufferedImage sourceImage = readImage(originPath);
		ResampleOp resampleOp = new ResampleOp(width, height);
		BufferedImage rescaledTomato = resampleOp.filter(sourceImage, null);
		ImageIO.write(rescaledTomato, getExtention(originPath).toLowerCase(),
				new File(savePath));
	}
	
	private static BufferedImage readImage(String imagePath) throws IOException {
		return readImage(new File(imagePath));
	}
	
	private static BufferedImage readImage(File image) throws IOException {
		return ImageIO.read(image);
	}
	
	/**
	 * 功能:提取文件名的后缀
	 * 
	 * @param fileName
	 * @return
	 */
	private static String getExtention(String fileName) {
		int pos = fileName.lastIndexOf(".");
		return fileName.substring(pos + 1);
	}

}

 

 

8、在com.xxx.web.struts.action包下创建ImageScissorAction控制器,负责接收页面参数调用ImageUtil执行图片压缩、剪切操作,代码如下:

 

 

 

package com.xxx.web.struts.action;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.google.gson.Gson;
import com.opensymphony.xwork2.ActionSupport;
import com.xxx.util.ImageUtil;

public class ImageScissorAction extends ActionSupport {
	
	private static final long serialVersionUID = -5971162241884111578L;
	private Integer x1;
	private Integer x2;
	private Integer y1;
	private Integer y2;
	private String originPath;
	private String savePath;
	private Integer scaleWidth;
	private Integer scaleHeight;
	
	/**
	 * 缩放比例
	 */
	private String proportion;
	
	/**
	 * 获取web服务器路径
	 * @param relativePath
	 * @return
	 */
	protected String getRealPath(String relativePath) {
		
		return ServletActionContext.getServletContext().getRealPath(relativePath);
	}
	
	@Override
	public String execute() throws Exception {
		
		try {
			// 取出服务器host以及端口等
			originPath = originPath.substring(originPath.indexOf("/images"));
			if (originPath.contains("?")) {
				originPath = originPath.substring(0, originPath.indexOf("?"));
			}
			
			originPath = getRealPath(originPath);
			if (savePath == null || savePath.trim().equals("")) {
				savePath = originPath;
			}
			if (x1 != null && x2 != null && y1 != null && y2 != null) {
				ImageUtil.scissor(x1, x2, y1, y2, originPath, savePath);
			}
			
			if (scaleWidth != null && scaleWidth != null) {
				ImageUtil.scaleImage(scaleWidth, scaleHeight, originPath,
						savePath);
			}
			
			outputJson("图片处理成功");
			
		} catch (Exception e) {
			
			outputJson("图片处理失败");
		}
		
		return null;
	}
	
	/**
	 * 直接转发imgscissor.jsp页面
	 * @return
	 */
	public String toScissor() {
		return SUCCESS;
	}
	
	/** 
	* 输出JSON信息 
	* @param jsonObj 
	*/  
	private void outputJson(Object jsonObj){  

		HttpServletResponse response = ServletActionContext.getResponse();  
		response.setContentType("application/json;charset=utf-8");  
		response.setHeader("Cache-Control", "no-cache");  
		  
		try {
		    
		    PrintWriter pw = response.getWriter();  
		    //将Java对象转换为JSON字符串  
		    String gsonStr = new Gson().toJson(jsonObj);  
		    //输出JSON字符串  
		    pw.print(gsonStr);  
		      
		    pw.flush();  
		    pw.close();  
		    
		} catch (IOException e) {  
		    System.out.println("输出GSON出错:" + e);  
		}
	}

	public void setX1(Integer x1) {
		this.x1 = x1;
	}

	public void setX2(Integer x2) {
		this.x2 = x2;
	}

	public void setY1(Integer y1) {
		this.y1 = y1;
	}

	public void setY2(Integer y2) {
		this.y2 = y2;
	}

	public void setOriginPath(String originPath) {
		this.originPath = originPath;
	}

	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}

	public String getOriginPath() {
		return originPath;
	}

	public void setScaleWidth(Integer scaleWidth) {
		this.scaleWidth = scaleWidth;
	}

	public void setScaleHeight(Integer scaleHeight) {
		this.scaleHeight = scaleHeight;
	}

	public String getProportion() {
		return proportion;
	}

	public void setProportion(String proportion) {
		this.proportion = proportion;
	}
	
}

 

 

9、在applicationContext-actions.xml中配置ImageScissorAction,由Spring管理,配置如下:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<!-- 创建FilmAction -->
	<bean id="filmAction"	
		class="com.xxx.web.struts.action.FilmAction"
		scope="prototype"/>
	
	<!-- 创建ImageScissorAction -->
	<bean id="imageScissorAction"	
		class="com.xxx.web.struts.action.ImageScissorAction"
		scope="prototype"/>
	
</beans>

 

10、在struts.xml中配置ImageScissorAction访问名称与方法的对应,配置如下:

 

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<constant name="struts.devMode" value="true" />
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<constant name="struts.objectFactory" value="spring" />
	<constant name="struts.objectFactory.spring.autoWire" value="type" />
	<constant name="struts.ui.theme" value="simple"></constant>
	
	<package name="film" namespace="/film" extends="struts-default">
		
		<!-- 获取所有影片 -->
		<action name="findFilm" class="filmAction" method="findFilm">
			<result name="success">/manager/films.jsp</result>
		</action>
		<!-- 添加影片 -->
		<action name="insertFilm" class="filmAction" method="insertFilm">
			<!-- 默认拦截器 -->
			<interceptor-ref name="defaultStack" />
			<!-- 文件上传拦截器 -->
			<interceptor-ref name="fileUploadStack">
				<!-- 配置允许上传的文件大小,单位字节(默认2M) -->
              	<param name="maximumSize">10000000</param>
				<param name="allowedTypes">
					image/bmp,image/png,image/gif,image/jpeg
                </param>
			</interceptor-ref>
			<result name="success" type="redirectAction">findFilm</result>
		</action>
		<!-- 获取影片详情 -->
		<action name="detailFilm" class="filmAction" method="detailFilm">
			<result name="success">/manager/updateFilm.jsp</result>
		</action>
		<!-- 修改影片 -->
		<action name="updateFilm" class="filmAction" method="updateFilm">
			<!-- 默认拦截器 -->
			<interceptor-ref name="defaultStack" />
			<!-- 文件上传拦截器 -->
			<interceptor-ref name="fileUploadStack">
				<!-- 配置允许上传的文件大小,单位字节(默认2M) -->
              	<param name="maximumSize">10000000</param>
				<param name="allowedTypes">
					image/bmp,image/png,image/gif,image/jpeg
                </param>
			</interceptor-ref>
			<result name="success" type="redirectAction">findFilm</result>
		</action>
		<!-- 删除影片 -->
		<action name="deleteFilm" class="filmAction" method="deleteFilm">
			<result name="success" type="redirectAction">findFilm</result>
		</action>
		
		<!-- 图片剪切、压缩处理Action -->
		<action name="toScissor" class="imageScissorAction" method="toScissor">
			<result name="success">/manager/imgscissor.jsp</result>
		</action>
		<action name="scissor" class="imageScissorAction">
			<!-- 响应类型为text/html -->
			<param name="contentType">text/html</param>
		</action>
		
	</package>
	
</struts>

 

 

 

Struts2 图片上传、缩放、剪切处理 第一节

 

 

 

14
0
分享到:
评论
4 楼 xurichusheng 2012-08-24  
在firefox中没反应呀
3 楼 oracle9isql 2012-05-18  


程序在
/MyBatiesTest5/src/com/xxx/web/struts/action/ImageScissorAction.java
中:


originPath = originPath.substring(originPath.indexOf("/images"));
报空指针异常, debug 下看到是originPath 没有赋值,为什么,请赐教

2 楼 teatot 2011-11-15  
mark一下
1 楼 mtain 2011-11-14  
  牛人

相关推荐

    Struts2 图片上传、缩放、剪切处理 第一节

    在本教程中,我们将探讨如何在Struts2中实现图片上传、缩放和剪切功能。 首先,让我们了解图片上传的基本步骤。在Struts2中,我们可以使用`CommonsFileUpload`库来处理文件上传。你需要在Struts2配置文件(struts....

    struts2图片上传并预览

    4. 图片处理:可以使用Java的图像处理库如ImageIO对上传的图片进行缩放、裁剪等操作,以适应不同的显示需求。 通过以上步骤,你已经成功实现了Struts2框架下的图片上传和预览功能。SmartUpload_demo可能是一个包含...

    struts2上传下载+前端剪切图片

    在"struts2上传下载+前端剪切图片"这个主题中,我们将探讨Struts2框架如何处理文件上传和下载功能,以及如何在前端实现图片的剪切操作。 **文件上传**: 在Struts2中,文件上传主要依赖于Apache的Commons ...

    struts2 上传图片显示

    Struts2是一个流行的Java Web框架,它为开发者提供了一种模型-视图-控制...这个过程需要对Struts2框架、文件I/O、图片处理以及Web安全有深入理解。通过实践,你可以更好地掌握这些技能,为用户提供更加丰富的交互体验。

    struts2 图片上传,图片大小,图片格式

    在本项目中,我们关注的是Struts2中的图片上传功能,以及如何处理图片的大小和格式问题。这个压缩包包含了实现这些功能所需的jar文件和其他资源,例如TestUpload_Struts2项目。 首先,图片上传是Web应用中常见的...

    struts2结合jquery剪切图片

    6. **Struts2处理**:在Struts2 Action中,我们需要定义一个接收图片数据的字段,并配置相应的拦截器以处理文件上传。Struts2提供了丰富的插件和配置选项,可以方便地处理这种上传请求。 7. **后端存储**:在服务器...

    ckeditor+struts2上传图片

    6. **前端交互**:在CKEditor的配置中,设置图片上传的回调函数,用于处理Struts2返回的响应,将图片URL插入到编辑器中。 7. **安全考虑**:在实际应用中,除了基本的文件上传功能外,还需关注安全性问题,如防止跨...

    struts2图片上传并生成缩略图,展示缩略图点击显示大图

    对于初学者来说,这是一个很好的练习,涵盖了文件上传、图片处理和前端组件的使用。在实际项目中,还需要考虑安全性问题,如防止恶意文件上传和处理多文件上传。此外,还可以优化图片存储策略,如使用云存储服务,并...

    struts实现上传图片

    在图片上传的场景下,Action类需要处理文件上传的请求,包括接收文件、处理文件(如缩放、添加水印)、保存文件到服务器等操作。上述代码片段展示了如何在Action类中实现这些功能。例如,使用`BufferedInputStream`...

    struts2.0图片上传代码

    Struts2.0图片上传是Web开发中常见的一项功能,涉及到的主要知识点包括Struts2框架、文件上传处理、IO流操作以及配置文件的设定。在本文中,我们将深入探讨这些内容,帮助你理解和实现Struts2.0环境下的图片上传功能...

    struts2实现单个图片上传

    在这个例子中,我们没有使用JavaScript,而是完全依赖于Struts2框架来处理图片上传。Struts2的拦截器负责解析请求中的文件数据,Action执行文件保存逻辑,最后通过配置好的结果页面反馈给用户。这是一个基础的图片...

    xheditor集成struts2上传图片

    总之,集成xheditor和Struts2进行图片上传涉及到前端编辑器配置、后端Action处理、文件上传拦截器配置以及安全策略的制定。这是一个典型的前后端交互案例,对于理解和实践Web应用开发具有重要价值。通过这个过程,...

    struts2图片上传

    本文将详细讲解如何使用Struts2实现图片上传,并涉及相关的验证、处理和存储策略。 首先,要在页面上创建一个用于选择图片的表单元素。Struts2提供了一种简单的方式,通过使用其内置的`&lt;s:file&gt;`标签来实现。例如:...

    struts2 cropper 文件在线剪切保存

    Struts2 Cropper 是一个基于Java的Web框架Struts2的插件,它允许用户在浏览器端对上传的图片进行裁剪并实时保存到服务器。这个功能在许多应用场景中非常实用,比如用户头像的定制、产品图片的调整等。在本教程中,...

    struts2图片上传到服务器并异步加载显示服务器中图片

    Struts2是一个基于MVC(Model-View-...总的来说,Struts2图片上传到服务器并异步加载显示涉及到文件上传处理、服务器存储策略、Ajax异步请求以及前端展示技术。通过以上步骤,你可以构建一个功能完整的图片上传系统。

    简单使用注解的方式struts2的图片上传

    本项目主要介绍如何通过注解的方式实现Struts2的图片上传功能,这是一个非常实用的功能,尤其对于构建交互性强的Web应用来说。在本文中,我们将深入探讨Struts2的注解使用、图片上传流程以及相关的Java配置。 1. **...

    ssh框架用struts2 hibernate实现图片的上传源码

    在图片上传的场景中,Struts2提供Action类来接收用户上传的图片文件,同时可以通过配置Struts2的配置文件(struts.xml)来定义Action的映射路径和处理方法,使得前端请求能够正确地路由到后端的处理逻辑。...

    struts2实现文件上传下载

    Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在Action类中声明一个`List&lt;FileInfo&gt;`类型的字段,用于接收上传的文件信息。`FileInfo`是自定义的类,包含`File`对象...

    struts2上传图片

    在"struts2上传图片"这个场景下,我们将深入探讨如何在Struts2框架下实现用户上传图片的功能,并关注网站统计访问量以及防止重复提交的问题。 首先,上传图片是Web应用中常见的功能,它涉及到前端表单设计、后端...

    struts2 ajax图片上传

    在Struts2中实现Ajax图片上传功能,可以帮助用户在不刷新整个页面的情况下提交图片,提高用户体验。Ajax技术利用JavaScript的XMLHttpRequest对象与服务器进行异步数据交换,使得网页部分更新成为可能。 首先,我们...

Global site tag (gtag.js) - Google Analytics