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

利用Spring MVC 上传图片文件

阅读更多

 近日在工作当中,需要用到上传图片的功能,然而自己平时学习的时候只会使用struts的上传功能,但因为项目并没有使用struts,而是spring mvc ,最后不得不另寻它路。通过google和百度,看到了一些相关的介绍。经过自己的偿试,最终搞定利用spring mvc 上传文件的功能,完成图片的上传。如果只是为了上传图片,可以通过限制扩展名的形式达到目的。下面给出关键的代码部分。

 

关于spring的配置等我不在此介绍,下面的方法是基于spring mvc模式下的。

 

前台部分:

     其实前台部分很简单,就是普通的FORM表单文件上传形式就可以。如:

 

 <form action="comm_addProduct.do?method=saveProduct" method="post" enctype="multipart/form-data">
  <input name="imgFile" id="imgFile" type="file" />
</form>

 这里只需注意关键的地方,就是在FORM表单里必须有enctype="multipart/form-data"属性。关于为什么要这个属性,我想对于做过文件上传的人来说都明白。我就不多说了。不会的搜索一下吧!这里的前台非常简单,只做一个演示。

 

当前台的表单提交到后台后,我们重点来注意后台是如何处理上传过来的文件的。关键代码如下:

/**
	 * 上传图片文件,并保存到指定的路径当中
	 */
	public void addImage(HttpServletRequest request,String path1,String path2) {
		//转型为MultipartHttpRequest(重点的所在)
	     MultipartHttpServletRequest multipartRequest  =  (MultipartHttpServletRequest) request;
	     //  获得第1张图片(根据前台的name名称得到上传的文件) 
	     MultipartFile imgFile1  =  multipartRequest.getFile("imgFile");
	    
	     //定义一个数组,用于保存可上传的文件类型
	     List fileTypes = new ArrayList();
	     fileTypes.add("jpg");
	     fileTypes.add("jpeg");
	     fileTypes.add("bmp");
	     fileTypes.add("gif");
	     
	     //保存第一张图片
	     if(!(imgFile1.getOriginalFilename() ==null || "".equals(imgFile1.getOriginalFilename()))) {
/*下面调用的方法,主要是用来检测上传的文件是否属于允许上传的类型范围内,及根据传入的路径名
*自动创建文件夹和文件名,返回的File文件我们可以用来做其它的使用,如得到保存后的文件名路径等
*这里我就先不做多的介绍。
*/
	    	 File file1 = this.getFile(imgFile1, fileTypes,path1,path2);
	    	
	     }
	     
	    
	}
 

其实上面的代码还是比较简单的,重点再于将我们常见的request对象转换为MultipartHttpRequest对象,有了这个对象,我们就可以得到用户上传的文件了。得到用户上传的文件之后,

我们就可以做一些我们想做的事情了。在上面我们还做了一些事,那就是判断用户上传的文件类型是否属于我们所定义的那个

数组内的类型,至于如何判断是否属于允许上传的类型,我会在下面的方法当中给出。其实也可以将下面的代码写在一个方法里,但是了为重用,我就分开写了。也许我的做法不是最好的。相当于给大家一个方向吧!

 

我们来看下面的两个方法,这两个方法最主要做两件事。一、判断用户上传的文件是否属于我们定义的类型范围之内,第二、将文件保存到指定的路径,这个路径是我们自己创建的。

/**
	 * 通过传入页面读取到的文件,处理后保存到本地磁盘,并返回一个已经创建好的File
	 * @param imgFile 从页面中读取到的文件
	 * @param typeName	商品的分类名称
	 * @param brandName 商品的品牌名称
	 * @param fileTypes 允许的文件扩展名集合
	 * @return
	 */
	private File getFile(MultipartFile imgFile,String typeName,String brandName,List fileTypes) {
		String fileName = imgFile.getOriginalFilename();
		//获取上传文件类型的扩展名,先得到.的位置,再截取从.的下一个位置到文件的最后,最后得到扩展名
	     String ext = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());
	     //对扩展名进行小写转换
	     ext = ext.toLowerCase();
	     
	     File file = null;
	     if(fileTypes.contains(ext)) {						//如果扩展名属于允许上传的类型,则创建文件
	    	 file = this.creatFolder(typeName, brandName, fileName);
	    	 try {
	 			imgFile.transferTo(file);					//保存上传的文件
	 		} catch (IllegalStateException e) {
	 			e.printStackTrace();
	 		} catch (IOException e) {
	 			e.printStackTrace();
	 		}
	     }
	     return file;
	}
	
	/**
	 * 检测与创建一级、二级文件夹、文件名
            这里我通过传入的两个字符串来做一级文件夹和二级文件夹名称
           通过此种办法我们可以做到根据用户的选择保存到相应的文件夹下
           
	 */
	private File creatFolder(String typeName,String brandName,String fileName) {
		 File file = null;
		 typeName = typeName.replaceAll("/", "");				//去掉"/"
		 typeName = typeName.replaceAll(" ", "");				//替换半角空格
		 typeName = typeName.replaceAll(" ", "");				//替换全角空格
		
		 brandName = brandName.replaceAll("/", "");				//去掉"/"
		 brandName = brandName.replaceAll(" ", ""); 			//替换半角空格
	     brandName = brandName.replaceAll(" ", "");				//替换全角空格
	    
	     File firstFolder = new File("c:/" + typeName);			//一级文件夹
	     if(firstFolder.exists()) {								//如果一级文件夹存在,则检测二级文件夹
	    	 File secondFolder = new File(firstFolder,brandName);
	    	 if(secondFolder.exists()) {						//如果二级文件夹也存在,则创建文件
	    		 file = new File(secondFolder,fileName);
	    	 }else {											//如果二级文件夹不存在,则创建二级文件夹
	    		 secondFolder.mkdir();
	    		 file = new File(secondFolder,fileName);		//创建完二级文件夹后,再合建文件
	    	 }
	     }else {												//如果一级不存在,则创建一级文件夹
	    	 firstFolder.mkdir();
	    	 File secondFolder = new File(firstFolder,brandName);
	    	 if(secondFolder.exists()) {						//如果二级文件夹也存在,则创建文件
	    		 file = new File(secondFolder,fileName);
	    	 }else {											//如果二级文件夹不存在,则创建二级文件夹
	    		 secondFolder.mkdir();
	    		 file = new File(secondFolder,fileName);
	    	 }
	     }
	     return file;
	}
 

以上代码基本上实现了我们想要的功能。当然其中还是存在许多的问题,目前还只是达到了初步的功能,并没有写得非常严谨。关于在前台上如何利用javascript实现缩略图的功能,我会在后续的文章当中介绍!

 

 

 

 

分享到:
评论
4 楼 c888999c 2014-05-07  
挺好 稍微改点就能用
3 楼 b-mirror 2008-11-20  
不错,好好学习一下。
2 楼 jz573 2008-11-20  
恩 很好 最近也在搞这个  学习下
1 楼 HongCheng 2008-11-19  
好东西
我看了

相关推荐

    Spring MVC登录源码

    Spring MVC登录源码,tomcat7+eclipse,jdk版本1.8,本地验证项目,整包上传,包含必须的lib库文件。代码说明见http://www.cnblogs.com/chenjie0949/p/5465747.html, 修改了相关代码,增加了库,本地调试通过。

    spring mvc+mybatis+maven+redis+权限管理+文件上传ftp+下载

    框架是Spring+SpringMvc+Mybatis+maven+redis。...2、文件管理,客户端上传文件到服务器,服务器将文件上传到ftp服务器。 客户端可从ftp服务器上下载文件到本地。 3、整合了redis缓存,加载了2个缓存进行切片管理。

    利用SpringMVC和Ajax实现文件上传功能

    主要为大家详细介绍了利用SpringMVC和Ajax实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring 2.0 开发参考手册

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 ...

    spring chm文档

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form...

    Spring中文帮助文档

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 ...

    springmvc+ajax异步上传 希望代码对大家有用

    利用spring的MultipartHttpServletRequest,MultipartFile独立异步上传文件 外带ajaxfileupload.js

    Spring API

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 ...

    Servle和JSP学习指南,完整扫描版

    第11章展示如何利用Servlet 3的文件上传特性,以及如何在客户端改善用户的体验;第12章解释如何通过编程方式将资源发送到浏览器;第13章介绍如何利用Decorator模式以及类来改变Servlet请求和响应的行为;第14章讨论...

    java项目源码之SaaS OA协同办公软件 v2.0的实现.rar

    Spring MVC:利用Spring MVC框架实现项目的Web层管理,实现了前后端分离,提高了系统的可扩展性和性能。 Hibernate ORM:采用Hibernate框架实现对象关系映射,简化了数据持久化操作,提高了数据访问效率和可靠性。 ...

    接口开发、springboot、接口转发、前端直接调用图床API时我们发现会报错,编写一个后端接口进行代理即可解决,已实现的例子

    前端直接调用图床API接口报错,利用后端接口进行文件转发实现接口反向代理 使用Spring Boot内置的`RestTemplate`来实现。以下是一个基于`RestTemplate`转发文件上传请求到目标服务的示例 主要运用了以下技术: 1. ...

    基于Springboot+Vue的电影院售票系统源码

    该项目资源中包括:数据库文件+开发文档+源代码,需要【系统搭建视频教程】以及【全套环境资源(软件)】请+V【LZYM3344】,由于资源太大无法上传 基于Springboot+Vue的电影院售票系是一个利用现代Web技术构建的综合...

    基于ssm框架搭建的人事管理系统+源代码+文档说明

    该系统主要利用Spring + Spring MVC + Mybatis 框架进行搭建, 其包含了用户管理、部门管理、职位管理、员工管理、公告管理、下载中心等常用的人事管理系统功能, 其中用户管理、部门管理等模块包含了项目开发中常用...

    ssm项目weixin204基于微信的疫情期间学生请假与销假系统的设计与实现ssm.zip

    利用SSM(Spring Spring MVC MyBatis)框架实现,该系统旨在简化和数字化学校的请假流程,确保管理工作的准确性和高效性。 项目的主要功能包括: 1. 用户角色管理:系统区分不同的用户角色,如学生、教师、管理员...

    weixin121作品集展示微信小程序+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    "weixin121作品集展示微信小程序+ssm(源码+部署说明+演示视频+源码介绍+lw).rar" 这个资源包似乎是一个压缩文件,其中包含了与一个特定的微信小程序项目相关的多个元素。以下是对这个资源的概括性介绍: 技术栈:...

    weixin061互助学习小程序的设计与实现+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    技术框架:该小程序可能使用了SSM(Spring + Spring MVC + MyBatis)框架,这是Java企业级应用开发中常用的一套组合。Spring负责依赖注入和事务管理,Spring MVC处理Web层的请求分发,而MyBatis则作为数据访问层,...

    SpringBoot项目原创歌曲分享平台.zip

    利用SpringBoot的快速开发特性和微服务架构,该平台能够高效地处理用户上传的音乐文件、元数据以及社交互动,同时提供易于使用的Web界面。 系统可能采用前后端分离的设计模式,前端使用现代JavaScript框架如...

    SpringMVC + jquery.uploadify实现上传文件功能

    件上传是很多项目都会使用到的功能,SpringMVC当然也提供了这个功能。不过小编不建议在项目中通过form...下面这篇文章主要介绍了利用SpringMVC + jquery.uploadify实现上传文件功能的相关资料,需要的朋友可以参考下。

Global site tag (gtag.js) - Google Analytics