`

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方法没有变化所以就没获取到。)

分享到:
评论

相关推荐

    struts与hibernate实现文件的上传与动态下载

    通过以上步骤,你可以实现一个基于Struts2和Hibernate的文件上传与动态下载系统。这个系统能够处理用户上传的文件,将其保存到服务器,同时提供动态下载功能,允许用户根据需要下载文件。在实际开发中,还需要考虑...

    struts2 实现文件批量上传

    本项目实现了使用Struts2进行文件批量上传的功能,这涉及到几个关键的技术点,包括文件上传组件的选择、前端表单设计、后端处理逻辑以及存储策略。 1. **文件上传组件**:在Struts2中,我们通常使用`Commons ...

    Struts2实现多文件上传

    在Struts2中,实现多文件上传功能是常见的需求,尤其在处理用户需要上传多个文件的场景下,如上传图片、文档等。本篇文章将详细介绍如何使用Struts2来实现这一功能。 首先,我们需要理解Struts2的上传机制。在...

    eclipse下利用struts2实现文件的上传和下载

    以上是使用Struts2在Eclipse环境下实现文件上传和下载的基本步骤和关键知识点。具体实现可能需要根据项目需求进行调整,但这些指导原则能帮助你构建一个基本的文件管理功能。在实际项目中,务必注意代码的健壮性和...

    struts2+jquery+ajax文件异步上传

    这个项目是在MyEclipse环境下实现的一个简单的文件上传功能,让我们深入了解一下这些技术及其在文件上传中的应用。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它提供了强大的...

    Struts2实现单个文件多个文件上传与下载-多个拦截器

    要实现文件上传,你需要在Action类中定义一个字段,类型为`java.io.File`或`org.apache.struts2.dispatcher.multipart.FileItem`,并添加对应的`@FileUpload`注解。例如: ```java public class FileUploadAction ...

    struts2文件上传例子.rar

    总的来说,这个例子展示了如何在Struts2框架下实现文件上传功能,包括Action的编写、配置文件的设定、表单的创建以及文件处理逻辑。通过学习这个例子,开发者可以了解到Struts2处理文件上传的基本流程,为自己的项目...

    struts2实例 自定义过滤器 文件上传下载 登录功能

    本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...

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

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

    Struts2+uploadify上传文件

    Struts2和Uploadify是两种在Web开发中用于文件上传的技术。Struts2是一个基于MVC(模型-视图-控制器)设计模式的Java Web框架,它提供了强大的表单处理和动作调度功能。Uploadify则是一个JavaScript库,利用Flash...

    struts2中实现多文件上传

    Struts2是一个流行的Java web开发框架,它提供了一种优雅的方式来组织和控制应用程序的流程。在Struts2中实现多文件上传是一项...通过深入理解这些组件和交互过程,开发者可以更好地在自己的项目中实现文件上传功能。

    在struts 2中实现文件上传

    Struts 2是一个非常流行的Java Web框架,它提供了一种优雅的方式来组织和构建MVC(模型-视图-控制器)应用程序。...通过以上步骤,你可以在Struts 2环境中实现文件上传功能,为用户提供便捷的数据提交方式。

    Struts2属性文件详解

    该属性设定了Struts 2文件上传中整个请求内容的最大字节数限制,以防止过大的文件上传导致的问题。 #### struts.custom.properties 指定了Struts 2应用加载的用户自定义属性文件,自定义属性文件中的设置不会覆盖`...

    能运行的ExtJs+Struts2文件上传

    标题"能运行的ExtJs+Struts2文件上传"表明这是一个实现了文件上传功能的示例项目。在ExtJs中,可以利用其提供的FileInput组件创建一个文件选择器,用户可以选择文件并提交到服务器。Struts2则在服务器端处理文件上传...

    struts2 批量上传 图片+文件

    在Struts2的配置文件(struts.xml)中,我们需要配置一个Action来接收并处理文件上传的请求。确保Action类继承了`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器,该拦截器负责处理文件上传。 3. **...

    json struts2 ajax文件上传 input type=file,选择相同文件也提交 附带类库

    总的来说,这个项目展示了如何利用JSON、Struts2和Ajax技术实现文件上传,即使用户选择了相同的文件。通过合理的后端验证和前端交互设计,我们可以确保上传过程的顺畅和数据的一致性。使用MyEclipse这样的IDE,可以...

    struts2的上传,下载,删除文件

    以上就是关于Struts2中文件上传、下载和删除的基本原理及实现方法。在实际项目中,你可能需要根据具体需求进行更复杂的逻辑处理,例如文件预览、权限控制、错误处理等。理解这些核心概念和步骤,有助于构建安全、...

    用struts1实现文件的上传和下载

    要实现文件上传,你需要做以下几步: 1. **配置Struts1 ActionForm**:创建一个继承自Struts1的ActionForm类,添加一个类型为`java.io.File`的字段,用于接收上传的文件。例如,你可以创建一个名为`UploadForm`的类...

    Struts2下多文件的上传与下载

    本文详细介绍了如何在Struts2环境下实现多文件上传与下载的功能,包括配置文件的动态读取、上传路径的配置、文件上传与下载的具体实现等。通过本项目的实践,开发者可以更好地理解和掌握Struts2框架下的文件操作技术...

    struts2实现多文件上传

    ### Struts2实现多文件上传知识点详解 #### 实现原理 **Struts2**框架中的多文件上传功能主要是借助于**Apache Commons FileUpload**库来完成的。此库提供了处理HTTP请求中的`multipart/form-data`数据类型的能力...

Global site tag (gtag.js) - Google Analytics