`

struts2环境下实现文件上传

阅读更多

今天从慕课网学了如何用java在图片上添加水印(包括文字水印和图片水印),自己学着写了一遍理解了下,这里先写个简单的文件上传,往后再开始写水印功能。(也可以去慕课网看相应视频,链接:http://www.imooc.com/learn/482)。

环境:struts2环境。

 

一、单文件上传

1、文件上传界面主要代码:index.jsp:

<body>
  <h4>上传图片</h4>
  <hr />
  <form name="uploadFile" action="${pageContext.request.contextPath }/waterMark.action" method="post" enctype="multipart/form-data">
 	<input type="file" name="image"/><br />
 	<input type="submit" name="uploadImage" value="上传图片"/>
  </form>
  </body>

 2、配置struts.xml文件:

<package name="default" extends="struts-default">
	<action name="waterMark" class="com.wjl.watermark.WaterMarkAction" method="waterMark">
			<param name="uploadPath">/images</param>
			<result name="success">waterMark.jsp</result>
	</action>
</package>

 3、编写Action代码:

 a、集中处理文件上传的WaterMarkAction:

package com.wjl.watermark;

import java.io.File;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class WaterMarkAction extends ActionSupport{
	private File image;//上传的文件(注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件)
	private String imageFileName;//提交过来的file的名字
	private String uploadPath;//文件上传的路径(在struts.xml文件中进行配置)
	private PicInfo pic = new PicInfo();//上传后的文件对象
	public String waterMark() throws Exception{
		String realUploadPath = ServletActionContext.getServletContext().getRealPath(uploadPath);
		//上传图片
		UploadService uploadService = new UploadService();
		pic.setImageURL(uploadService.uploadImage(image, imageFileName, uploadPath, realUploadPath));
		return SUCCESS;
	}

	//image、imageFileName、uploadPath、pic的get/set方法	
}
 b、进行文件上传的UploadService:
package com.wjl.watermark;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class UploadService {
	/**
	 * 该方法用来上传文件
	 * @param image:上传的图片对象
	 * @param imageFileName:上传的文件名称
	 * @param uploadPath:上传文件的相对路径
	 * @param realUploadPath:上传文件的绝对路径
	 * */
	public String uploadImage(File image,String imageFileName,String uploadPath,String realUploadPath){
		InputStream is =null;
		OutputStream os = null;
		try {
			is = new FileInputStream(image);
			os = new FileOutputStream(realUploadPath+File.separator+imageFileName);
			
			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 (IOException e) {
					e.printStackTrace();
				}
			}
			if(os!=null){
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		//返回上传后的文件绝对路径
		return uploadPath+File.separator+imageFileName;
	}
}
 c、上传后的文件信息PicInfo:
package com.wjl.watermark;

public class PicInfo {
	private String imageURL;
	private String logoImageURL;
	//两个属性的get/set方法
}
4、图片上传后的页面展示waterMark.jsp:

先引入s标签:<%@ taglib uri="/struts-tags" prefix="s"%>

<body>
  <table width="99%" align="center">
  	<tr>
  		<td width="50%">
  			<img src=${pageContext.request.contextPath }<s:property value="pic.imageURL"/> width="350" >
  		</td>
  		<td width="50%">
  			<img src=${pageContext.request.contextPath }<s:property value="pic.logoImageURL"/> width="350" >
  		</td>
  	</tr>
  </table>
</body>

 

5、在webRoot目录下新建images目录,启动服务器进行测试。

 

二、多文件上传。

1、文件上传界面主要代码:index.jsp。

<body>
<h4>上传图片</h4>
<hr />
<form name="uploadFile" action="${pageContext.request.contextPath }/waterMark.action" method="post" enctype="multipart/form-data">
 	<input type="file" name="image"/><br />
 	<input type="file" name="image"/><br />
 	<input type="file" name="image"/><br />
 	<input type="file" name="image"/><br />
 	<input type="file" name="image"/><br />
 	<input type="file" name="image"/><br />
 	<input type="file" name="image"/><br />
 	<input type="submit" name="uploadImage" value="上传图片"/>
</form>
</body>

2、struts.xml配置文件与单文件上传一致。

 

3、用来进行文件上传的UploadService和记录上传后的文件PicInfo与单文件上传相同,集中处理的WaterMarkAction主要修改如下:

package com.wjl.watermark;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class WaterMarkAction extends ActionSupport{
	private File[] image;
	private String[] imageFileName;
	private String uploadPath;
	private List<PicInfo> picInfo = new ArrayList<PicInfo>();
	public String waterMark() throws Exception{
		String realUploadPath = ServletActionContext.getServletContext().getRealPath(uploadPath);
		if(image!=null && image.length>0){
			PicInfo pic=null;
			UploadService uploadService = new UploadService();
			for(int i=0;i<image.length;i++){
				pic = new PicInfo();
				//上传图片
                                pic.setImageURL(uploadService.uploadImage(image[i], imageFileName[i], uploadPath, realUploadPath));
				picInfo.add(pic);
			}
		}
		return SUCCESS;
	}
	//image、imageFileName、uploadPath、pic的get/set方法
}

 

4、图片上传后的页面展示waterMark.jsp:

记得引入s标签:<%@ taglib uri="/struts-tags" prefix="s"%>

<body>
  <table width="99%" align="center">
  	<s:iterator value="picInfo">
	  	<tr>
	  		<td width="50%">
	  			<img src=${pageContext.request.contextPath }<s:property value="imageURL"/> width="350" >
	  		</td>
	  		<td width="50%">
	  			<img src=${pageContext.request.contextPath }<s:property value="logoImageURL"/> width="350" >
	  		</td>
	  	</tr>
  	</s:iterator>
  </table>
</body>

 

5、进行测试。

 

注意点:

1、文件上传之后记得关闭各种流,避免出现乱七八糟的问题。

2、进行文件上传的form表单一定要设置enctype="multipart/form-data";

3、WaterMarkAction中的File image中的image变量必须与index.jsp中type="file"类型的input框name值相同,否则无法对应上。

4、WaterMarkAction中的imageFileName不是我们自己配置的而是由Struts自带的,它遵循的原则是:前台file控件的name名称+"FileName"。我这里file控件的name是image,所以文件名称我定义imageFileName。若控件名称为file那么则应该定义成fileFileName,file的MIME类型也遵循同样的原则。否则获取不到文件名称。

5、用来记录上传后的文件信息的PicInfo对象中的两个属性一定要给get/set方法,否则在waterMark.jsp页面中无法直接使用其属性。

6、picInfo这个对象给定的get/set方法一定要是getPicInfo/setPicInfo,要是弄成getPic/setPic,那么在waterMark.jsp页面中直接使用imageURL和logoImageURL就会获取不到值。(我会犯这个错就是因为原本picInfo的名称是pic后来改成picInfo的,但是get/set方法没有变化所以就没获取到。)

分享到:
评论

相关推荐

    uploadify3与struts2结合实现有进度条文件上传实例

    这是根据uploadify3 2结合struts2搭建的文件上传环境 可以直接导入eclipse运行 每步实现基本都加了注释 以下是我碰到的问题: 1 判断session是否失效 本实例没测试这个问题 但在工作项目中碰到了 但原因在这里...

    kindeditor图片上传 struts2实现

    介绍kindeditor环境部署已经如何进行图片上传。整合struts2以及页面bootstrap展现来进行 详细介绍。kindeditor版本为4.1.10

    JEE2实现文件上传

    JEE2 实现文件上传是指在 JEE2 环境中实现文件上传的过程。文件上传是指从客户端将文件发送到服务器端的过程。在 JEE2 中,我们可以使用 Servlet 和 JSP 来实现文件上传。 首先,我们需要了解 HTTP 请求的机制。...

    使用struts 2 和ajaxFileUpload组件实现图片上传预览(完整版)

    使用struts 2 和ajaxFileUpload组件实现图片上传预览,直接在myeclipse和tomcat环境下就可以运行,同时附带了相应的实现说明。

    Struts2详解,Struts2与Struts1的区别

    新手必备,看完绝对思路清晰。醍醐灌顶啊! 一. Struts2介绍 1. Struts2简介 2. Struts2和Struts1的常见... 实现文件上传 12. Struts2的拦截器 13. 拒绝表单重复提交 四. OGNL表达式 五. Struts2中常用标签

    用struts2实现的文件上传与下载

    该程序是在Eclipse+Tomcat环境下编写。上传时会将文件上传到应用路径下的upload文件夹。如果要下载请确保upload文件夹内有文件。

    struts2 详解文档

    介绍Struts 2及Struts 2开发环境的搭建 第一个Struts 2应用开发 解决Struts 2配置文件无提示问题 Action名称的搜索顺序 Action配置的各项默认值 result配置的各种视图转发类型 为Action属性注入值 指定...

    Struts2 in action中文版

    3.5 案例研究:文件上传 56 3.5.1 通过struts-default包获得内建的支持 56 3.5.2 fileUpload拦截器做什么 57 3.5.3 Struts 2公文包示例代码研究 58 3.6 小结 60 第4章 使用拦截器追加工作流 61 4.1 为什么要拦截...

    基于struts2+hibernate的在线视频播放系统

    运行环境:myeclipse2016,tomcat7.0,mysql。本系统是基于struts2+hibernate的在线视频播放系统,有管理员和用户两种身份。主要功能:用户上传视频,管理员审核。其他功能:个人信息修改,视频增删查改,头像修改,...

    基于struts2 的网络U盘

    数据库包括用户表和文件表,项目主体由Struts2框架搭建,前台jsp页面表单使用OGNL标签,XX_zh_CN(en_US).properties文件实现中英文国际化,XXAction-validation.xml实现表单校验,MD5加密文件绝对路径,保护文件安全...

    基于Struts框架的Web文件管理系统(毕业设计)

    本系统使用Struts技术,实现了文件的上传、下载等等一系列的文件管理,使用的开发环境是MyEclipse3.7

    struts简单实现用户注册(最新修订)

    8.ajax的文件上传 9.批量删除 10.token控制刷新提交 11.简单的excl报表 12.简单的download 13.简单的listener 说明:有志同道合之士,容忍下我的不入流的代码,看看我的实现上出在什么地方 开发环境:...

    extjs中本地照片预览、blob数据在oracle中存取

    环境为java,struts2,extjs...没有完全实现的是extjs用uploadfild控件实现的blob数据上传预览,并且尝试了用formFile上传文件、和smart组件上传,但两者在我的环境里还有问题,大家可以改进一下,本人觉得有总比没有强哈

    SSH中实现上传下载

    开发环境: MyEclipse6.0(Struts1.3、Spring2.0、hibernate3.0) SqlServer2005 实现了对文件以及图片的上传下载,并将文件路径及文件名添入数据库!

    JSF+Spring+JPA(Hibernate实现)的环境搭建

    我个人还是比较推崇apache的Struts2的,当然了,apache的JSF实现和JSF组件也是相当地杠杠的!!!!JSF更贴近事件比较多的web前端处理机制。想想我们一般要接收和处理页面的各种事件是用什么:js函数+ajax处理是吧...

    ftp环境下的文本信息展示和修改,以及多ftp路径的文件备份

    本资料实现了ftp环境下的文本信息展示和修改,以及多ftp路径的文件备份,所需要的工具除了常规的myeclipse外,还有搭载ftp环境用的serv-u,ftp的环境搭载不再熬述,网上有很多教程 如果有疑问可以加群103684733共同...

    绝对好用!extjs中本地照片预览、blob数据在oracle中存取.zip

    环境为java,struts2,extjs3.0 js中除了现在用的textfield控件外,还有uploadfild可以支持extjs中文件的上传,但值得注意的是,form里的fileUpload属性必须为true, 前者支持IE和火狐 后者IE可以正常取得控件,而...

    《开发者突击:Java web主流框架整合开发》源代码2

    《开发者突击:Java Web主流框架整合开发(第2版) ,全面地讲解了Java Web开发中的流行技术和软件架构,涵盖了目前从JSP、JavaBean、...因为每次上传的文件不得超过60M所以分成4个压缩包上传的,这个是其中的一部分

    JAVA WEB典型模块与项目实战大全

    第15章 在线文件上传和下载(struts 2.x+fileupload)  15.1 在线文件上传和下载模块原理  15.2 文件上传组件fileupload  15.3 初步使用文件上传组件(components-fileupload)  15.4 单文件的上传  15.5 多...

    MyEclipse_9创建SSH2开发环境必须的独立包

    struts2 相关包-------------------------------------------------- xwork-2.0.5.jar webwork的核心库 ognl-2.6.11.jar OGNL表达式语言,struts2支持该EL freemarker-2.3.8.jar 表现层框架,定义了struts2的可视...

Global site tag (gtag.js) - Google Analytics