`

文件上传(spring+struts+jquery)

 
阅读更多

最近实现了文件上传的功能,是基于spring +struts+jquery实现的。

需要注意的是 前台要引用jquery的 ajaxfileupload.js 文件。

 

具体伪代码如下:

1,控制层. 

我们提供了一个基类定义了一个文件上传的基本设置,比如控键名和上传路径等,如何想要特别处理,需要子类继承 UploadFileCallback,实现callback 方法。

 下面代码是我整合后的基类和实现类在一起后的效果。

public class UploadAction extends ActionSupport implements Preparable, ModelDriven, UploadFileCallback{
public static String UPLOADFRONTENDBASEPATH = "/home/upload";

    static {
    //the path of upload file	
    UPLOADFRONTENDBASEPATH = SettingManager.getInstance().getConfig().getString("uploadfrontEndBasePath");
    }

    private File[]       uploadFile;
    
    private String[]     uploadFileFileName;
    
    private static final String[] imageSuffix = {".jpg",".JPG",".jpeg",".JPEG",".gif",".GIF",".png",".PNG",".bmp",".BMP",".ico",".ICO"}; 
    
  
    public String[] processUploadFile() {
		if (uploadFile != null) {
			String suffix = uploadFileFileName[0].substring(uploadFileFileName[0].lastIndexOf("."));
			Arrays.sort(imageSuffix);
			int result = Arrays.binarySearch(imageSuffix, suffix); // 在数组中搜索是否含有该后缀名
			if (result < 0) {	// 如果不包含,返回特殊值
				return new String[] { "FORMAT_ERROR" };
			}
			int fileCounts = uploadFile.length;
			logger.debug("UploadFile counts :" + fileCounts);
			// 按照File[]的长度初始化一个用于返回文件上传结果的String数组,这个数组的元素与File[]的元素一一对应
			String[] uploadFileResult = new String[fileCounts];
			// 判断子类是否实现了UploadFileCallback接口,如果实现了该接口,文件处理逻辑移交到子类实现.
			if (this instanceof UploadFileCallback) {
				UploadFileCallback callback = (UploadFileCallback) this;
				for (int i = 0; i < this.uploadFile.length; i++) {
					uploadFileResult[i] = callback.callback(this.uploadFile[i], this.uploadFileFileName[i]);
				}
			} else { // 子类没有实现UploadFileCallback接口,采用默认的文件处理方式:将上传的文件保存到应用的files目录中.
				String appDir = this.getRequest().getSession()
						.getServletContext()
						.getRealPath(DEFAULT_UPLOAD_FILE_DIR)
						+ File.separator;
				File dir = new File(appDir);
				if (!dir.exists()) {
					dir.mkdir();
				}
				for (int i = 0; i < this.uploadFile.length; i++) {
					String filePath = appDir + this.uploadFileFileName[i];
					try {
						// 把临时文件复制到目标路径下
						FileUtils.copyFile(this.uploadFile[i], new File(
								filePath));
						// 文件地址作为上传结果返回
						uploadFileResult[i] = filePath;
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			return uploadFileResult;
		} else {
			return null;
		}
    }
    
    public File[] getUploadFile() {
        return uploadFile;
    }
    
    public void setUploadFile(File[] uploadFile) {
        this.uploadFile = uploadFile;
    }
    
    public String[] getUploadFileFileName() {
        return uploadFileFileName;
    }
    
    public void setUploadFileFileName(String[] uploadFileFileName) {
        this.uploadFileFileName = uploadFileFileName;
    }

/**
	 * 图片上传回调函数
	 */
	@Override
	public String callback(File uploadFile, String uploadFileFileName) {
		String suffix = uploadFileFileName.substring(uploadFileFileName.lastIndexOf("."));
		uploadFileFileName =generateFileName(suffix);
		
		//BACK GROUND
		String appDir = getFeedbackPath(BASEPATH);
		String filePath = appDir + uploadFileFileName;
		File old = new File(filePath);
		if(old.exists()){
			old.delete();
		}

		
		try {
			// 把临时文件复制到目标路径下(同时备份)
			FileUtils.copyFile(uploadFile,new File(URLDecoder.decode(filePath, "UTF-8")));
			
			//如果前后台部署在二个tomcat下面,那么图片则同时复制一份。
			if(!UPLOADFRONTENDBASEPATH.equals(BASEPATH)){
				//FRONT END
				String frontDir = getFeedbackPath(UPLOADFRONTENDBASEPATH);
				String frontFilePath = frontDir + uploadFileFileName;
				File frontOld = new File(frontFilePath);
				if(frontOld.exists()){
					frontOld.delete();
				}
				
				// 把临时文件复制到目标路径下(同时备份)
				FileUtils.copyFile(uploadFile,new File(URLDecoder.decode(frontFilePath, "UTF-8")));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return uploadFileFileName;
	}
    
	// 存放图片地址
	public String getFeedbackPath(String basepath) {
		String realPath = basepath + File.separator+"feedbackPic" + File.separator;
		File dir = new File(realPath);
		if (!dir.exists()) {
			dir.mkdir();
		}
		return realPath;
	}
	
	private String generateFileName(String fileName) {
		DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		String formatDate = format.format(new Date());
		int random = new Random().nextInt(10000);
		int position = fileName.lastIndexOf(".");
		String extension = fileName.substring(position);
		return formatDate + random + extension;
	}

	/**
	 * 
	 * @return
	 */
	public String ajaxUploadFiles(){
		Map<String, Object> result = new HashMap<String, Object>();
    	String[] files= processUploadFile();
    	
    	if(files != null && files.length>0){
    		if("FORMAT_ERROR".equals(files[0])){
    			result.put("isSuccess", false);
    		}else{
    	    	result.put("filePath", files[0]);
    	    	result.put("isSuccess", true);
    		}
    		
    	}
    	
    	this.getRequest().setAttribute(GsonResult.GSON_RESULT_OBJECT, result);
		
		return "ajax";
	}

}

 

2. jsp 界面

 我采用的是ajax处理图片上传。 上传控键名为uploadFile。

 

<!-- js reference-->
<script type="text/javascript" src="scripts/jquery/ajaxfileupload.js"></script>
<script type="text/javascript" src="scripts/jquery/jquery1.7.js"></script>


	<div>
			                            <a href="javascript:addImgAttachment();" id="staffInfo_add">
						                        <i class="ydicons ydicons-feedbackAttach"></i> 添加附件
						                </a> 
 <input class="" id="uploadFile" name="uploadFile" type="file" accept="image/*" onchange="uploaderImg();" style="display:none;">
</div>


<script type="text/javascript">
function uploaderImg() {
			$.ajaxFileUpload({
				url : "${ctx}/ss/ssAjax/Upload/ajaxUploadFiles.do", //上传文件的服务端
				secureuri : false, //是否启用安全提交
				dataType : "json", //数据类型  
				fileElementId : "uploadFile", //表示文件域ID
				success : function(data) {//提交成功后处理函数      html为返回值,status为执行的状态
					if (data.isSuccess) {
						//上传成功后处理
}
				},
				error : function(data, status, e) {//提交失败处理函数
					alert("上传失败!" + e);
				}
			});
		}
</script>

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Spring+Struts2+JQuery实现简单的登录功能

    在IT行业中,构建Web应用程序是常见的任务之一,而Spring、Struts2和JQuery是三个常用的框架和技术,它们各自在不同的层面上发挥作用,共同助力于高效、稳定的开发。本项目"Spring+Struts2+JQuery实现简单的登录功能...

    基于hibernate+spring+struts的学生选课系统

    1. **配置文件**:如hibernate.cfg.xml(Hibernate配置文件),struts.xml(Struts配置文件),spring配置文件(如applicationContext.xml,用于定义bean及它们之间的依赖关系)。 2. **实体类**:对应数据库表的...

    Spring + Struts +Hibernate简单学习源码

    - `src/main/resources`:存放配置文件,如Spring的beans.xml、Hibernate的hibernate.cfg.xml,以及Struts的struts-config.xml等。 - `WebContent/WEB-INF`:存放web.xml(Web应用的部署描述符),以及视图资源,...

    Struts+Spring+Mybatis+EasyUI(jQuery)注解案例

    Struts+Spring+Mybatis+EasyUI(jQuery)注解案例。采用注解的方式跟踪代码依赖性,实现替代配置文件功能。里面包含了平时用的增删改查及分页,分页查询时用的是存储过程,提高了数据库的性能。代码简单、易懂。

    spring+hibernate+jpa+struts1+struts2+springmvc+jquery+freemaker 学习笔记 案例.rar

    spring+hibernate+jpa+struts1+struts2+springmvc+jquery+freemaker 学习笔记 Compass将lucene、Spring、Hibernate三者结合

    SSI项目 spring+struts2+ibatis

    基于spring+struts2+ibatis开发的简单项目,里面有增加,修改,删除,查找功能,前台使用了ligerUI插件,需在jsp页面引用ligerUI的js文件,适合有一定jquery,java的初学者,并对ligerUI有一定的了解,否则将很难理解...

    struts2+spring+mybatis+easyui的实现

    在集成这四个组件时,首先我们需要在pom.xml文件中添加相应的依赖,然后创建项目的目录结构,包括src/main/resources下的配置文件(如struts.xml、spring-context.xml、mybatis-config.xml等),以及src/main/webapp...

    Eclipse+Struts2+Spring+MyBatis+jQuery整合教程

    Eclipse+Struts2+Spring+MyBatis+jQuery整合教程,Eclipse+Struts2+Spring+MyBatis+jQuery整合教程.

    json+jquery+struts2+hibernate+spring 实现的小型bbs系统,这个提供包

    json+jquery+struts2+hibernate+spring 实现的小型bbs系统,这个提供包 ,很不错的下载后,好好徐希一下吧

    jquery easyUI+struts2+spring+hibernate基于annotation实现的CRM

    【标题】:“jQuery EasyUI+Struts2+Spring+Hibernate基于注解实现的CRM系统” 在IT领域,CRM(Customer Relationship Management,客户关系管理)系统是企业用来优化与客户交互和管理的重要工具。本项目利用一系列...

    jquerygrid+spring+struts+hibernate

    在IT行业中,jQuery Grid(通常简称为jGrid)是一个强大的JavaScript数据网格插件,它能够与后端的数据存储系统如Spring、Struts和Hibernate等Java框架无缝集成,以实现高效的数据展示和管理。这个名为"jquerygrid+...

    Spring+Struts2+Hibernate javaweb网络商城系统+完整源码+可执行Mysq文件l

    可直接做毕业设计!Spring+Struts2+Hibernate框架 javaweb网络商城系统,管理员、商户、游客、购买者,商品信息,订单详情,购物车设计,完整代码_精美页面_可执行Mysql文件,系统导入Myeclipse即可执行!

    spring+struts+hibernate+jdbc+oracle+jms+flex+flamingle+jquery+plsql

    开发者需具备丰富的Java Web开发经验,对Spring、Struts、Hibernate等框架有深入理解,并能熟练掌握数据库设计和管理、前端交互以及消息队列等技术。这样的系统设计既体现了技术的多样性和灵活性,也对团队的技术...

    struts2+spring+hibernate+jquery+json

    `MyAddressList.rar`可能是一个包含项目源代码或资源的压缩文件,可能包含了Struts2、Spring、Hibernate的配置文件,jQuery的JavaScript文件,以及相关的HTML模板,这些文件共同构成了一个实际运行的Web应用示例。...

    JEECMS源码(hibernate3+struts2+spring2+freemarker +jquery +json等技术)

    JEECMS使用目前java主流技术架构:hibernate3+struts2+spring2+freemarker。AJAX使用jquery和json实现。视图层并没有使用传统的JSP技术,而是使用更为专业、灵活、高效freemarker。 数据库使用MYSQL,并可支持orcale...

    Spring+Hibernate+Struts+ajax+jQuery easyUI

    标题 "Spring+Hibernate+Struts+ajax+jQuery easyUI" 提到的是一个经典的Java Web开发技术栈,这个组合被广泛用于构建复杂的企业级应用程序。让我们深入探讨这些技术及其相互作用。 1. **Spring**:Spring 是一个...

    struts2+spring+ibatis+mysql

    "Struts2+Spring+Ibatis+MySQL" 是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、...

    jquery easyui 项目 +hibernate+spring+struts2.0

    【标题】"jQuery EasyUI 项目整合 Hibernate、Spring 和 Struts2.0" 【内容详解】 这个项目展示了如何将流行的前端框架jQuery EasyUI与后端的流行Java开发框架Hibernate、Spring和Struts2.0进行集成,以构建一个...

    spring+struts2+mybatis框架实现单表增删改查、条件查询和分页、文件上传

    以上就是关于"spring+struts2+mybatis框架实现单表增删改查、条件查询和分页、文件上传"项目的详细知识点解析。通过这个项目,初学者可以深入理解Java Web开发的流程,掌握SSM框架的整合与应用,以及数据库操作和...

    spring+struts2+easyui项目,可直接导入eclipse运行,包含数据库脚本与jar包说明

    该项目是一个基于Spring、Struts2和EasyUI的Web应用程序,旨在提供一套完整的权限控制系统。Spring作为核心框架,负责管理应用的bean和实现依赖注入,从而提高代码的可测试性和可维护性。Struts2作为MVC框架,处理...

Global site tag (gtag.js) - Google Analytics