糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > SpringMVC实现ajax上传图片实时预览

SpringMVC实现ajax上传图片实时预览

时间:2018-08-12 13:16:26

相关推荐

SpringMVC实现ajax上传图片实时预览

本文介绍使用SpringMVC+ ajaxfileupload.js 实现 ajax 上传文件。

先看效果图

点击上传文件框,触发上传文件方法,然后后台返回图片的 url,进行显示。

实现方法如下

一、前台代码

1、add.jsp (或者 html 文件)

<inputtype="file"name="file"id="file"onchange="uploadImg()"><inputtype="hidden"name="avatar"id="avatar"><imgsrc=""alt=""id="avatarShow"width="100px"height="100px">

2、引入 jquery 和ajaxfileupload.js

<scriptsrc="${pageContext.request.contextPath}/static/js/jquery.min.js"></script><scriptsrc="${pageContext.request.contextPath}/static/js/ajaxfileupload.js"></script>

这里给出ajaxfileupload.js下载地址,网上也有下载

这里有个坑,详情看这里使用ajaxfileupload.js上传文件成功之后,没有执行success方法

3、ajax 代码

<script>//ajax提交信息functionuploadImg(){if($("#file").val()!=""){$.ajaxFileUpload({type:"POST",url:"${pageContext.request.contextPath}/uploadFile",dataType:"json",fileElementId:"file", // 文件的idsuccess:function(d){if(d.code==0){//alert("上传成功");//图片显示$("#avatar").attr("value",d.data.url);$("#avatarShow").attr("src",d.data.url);}},error:function(){alert("上传失败");},});}else{alert("请先选择文件");}}</script>

需要放在 上面两个库的后面

注意:

① type 填 post

② 第8行的dataType 是小写的 json,不要写成大写的啦

③ 第9行的 fileElementId 填文件框的id

④ 先确保 url 没写错

二、后台代码

1、给 maven 添加依赖

①、首先需要导入 json 的依赖

<!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.5.0</version></dependency>

②、然后需要上传文件的依赖

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>

2、spring-mvc.xml

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:mvc="/schema/mvc"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.1.xsd/schema/context/schema/context/spring-context-3.1.xsd/schema/mvc/schema/mvc/spring-mvc-3.1.xsd"><!--启用SpringMVC的注解功能,它会自动注册HandlerMapping、HandlerAdapter、ExceptionResolver的相关实例--><mvc:annotation-driven/><!--SpringMVC的扫描范围--><context:component-scanbase-package="com.liuyanzhao.blog.controller"use-default-filters="false"><context:include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/><context:include-filtertype="annotation"expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan><!--用于返回json格式--><beanid="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><propertyname="supportedMediaTypes"><list><value>application/x-www-form-urlencoded;charset=UTF-8</value></list></property></bean><!--完成请求和注解POJO的映射--><beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><propertyname="messageConverters"><list><refbean="mappingJacksonHttpMessageConverter"/></list></property></bean><!--配置SpringMVC的视图解析器--><!--其viewClass属性的默认值就是org.springframework.web.servlet.view.JstlView--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>--><propertyname="prefix"value="/WEB-INF/views/"/><propertyname="suffix"value=".jsp"/></bean><!--文件上传--><beanid="multipartResolver"class="org.springframework.monsMultipartResolver"><!--设置上传最大尺寸为50MB--><propertyname="maxUploadSize"value="52428800"/><propertyname="defaultEncoding"value="UTF-8"/><propertyname="resolveLazily"value="true"/></bean></beans>

上面是 spring-mvc.xml 所有的代码

一定要添加 文件上传 那块代码(50-55行)

然后 31-38 行的 对象转成JSON 也要正确

3、UploadFileController.java

packagecom.liuyanzhao.blog.controller;importcom.liuyanzhao.blog.vo.ResultVO;importcom.liuyanzhao.blog.vo.UploadFileVO;importorg.springframework.data.repository.query.Param;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.IOException;importjava.util.Calendar;@ControllerpublicclassUploadFileController{//上传文件@RequestMapping(value="/uploadFile",method=RequestMethod.POST)@ResponseBodypublicResultVOuploadFile(@Param("file")MultipartFilefile)throwsIOException{//本地使用,上传位置StringrootPath="/Users/liuyanzhao/Documents/uploads/";//StringrootPath="/www/uploads/";//文件的完整名称,如spring.jpegStringfilename=file.getOriginalFilename();//文件名,如springStringname=filename.substring(0,filename.indexOf("."));//文件后缀,如.jpegStringsuffix=filename.substring(filename.lastIndexOf("."));//创建年月文件夹Calendardate=Calendar.getInstance();FiledateDirs=newFile(date.get(Calendar.YEAR)+File.separator+(date.get(Calendar.MONTH)+1));//目标文件FiledescFile=newFile(rootPath+File.separator+dateDirs+File.separator+filename);inti=1;//若文件存在重命名StringnewFilename=filename;while(descFile.exists()){newFilename=name+"("+i+")"+suffix;StringparentPath=descFile.getParent();descFile=newFile(parentPath+File.separator+dateDirs+File.separator+newFilename);i++;}//判断目标文件所在的目录是否存在if(!descFile.getParentFile().exists()){//如果目标文件所在的目录不存在,则创建父目录descFile.getParentFile().mkdirs();}//将内存中的数据写入磁盘file.transferTo(descFile);//完整的urlStringfileUrl="/uploads/"+dateDirs+"/"+newFilename;ResultVOresultVO=newResultVO();resultVO.setCode(0);resultVO.setMsg("成功");UploadFileVOuploadFileVO=newUploadFileVO();uploadFileVO.setTitle(filename);uploadFileVO.setUrl(fileUrl);resultVO.setData(uploadFileVO);returnresultVO;}}

注意:

① 一定要加@ResponseBody 注解,加了@ResponseBody 注解,我们返回的resultVO 对象会转成 JSON 返回前台。这个依赖于前面说的 spirng-mvc.xml 里的 JSON 配置

② 返回给前台的 JSON 格式如下

所以我这里封装了对象resultVO 和uploadFileVO 具体类下面会给出

③ 记得要修改第30行的本地路径,这个路径待会儿还要配静态资源映射

4、ResultVO.java 和 UploadFileVO.java

① ResultVO.java

packagecom.liuyanzhao.blog.VO;/***@author言曌*@date/11/30下午7:04*/publicclassResultVO<T>{//错误码privateIntegercode;//提示信息privateStringmsg;//返回的具体内容privateTdata;publicIntegergetCode(){returncode;}publicvoidsetCode(Integercode){this.code=code;}publicStringgetMsg(){returnmsg;}publicvoidsetMsg(Stringmsg){this.msg=msg;}publicTgetData(){returndata;}publicvoidsetData(Tdata){this.data=data;}}

这里的 T 表示泛型

② UploadFileVO.java

packagecom.liuyanzhao.blog.VO;/***@author言曌*@date/11/30下午7:41*/publicclassUploadFileVO{privateStringurl;privateStringtitle;publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this.title=title;}}

因为这里是上传图片,我们需要给前台返回返回一个 文件的URL,所以这里封装一个对象,用来拼接JSON。

三、设置静态资源映射,用于显示图片

我这里设置上传文件到/Users/liuyanzhao/Documents/uploads 目录

比如有一张图片的本地路径为

/Users/liuyanzhao/Documents/uploads//11/113021011541.jpg

我们想让它能在服务器上访问,需要给 Tomcat 配置静态资源映射

方法一、

使用 IDE 配置,比如我使用的是 IntelliJ IDEA 可以在 Tomcat 的配置 Development 里,如图

方法二、

如果你是直接启动本地的 Tomcat,而不是 IDE 的(不太记得 Eclipse 能不能直接设置),可以在 Tomcat 的目录下的 config/server.xml 里

我的是

/Users/liuyanzhao/Documents/JavaStudy/tomcat/apache-tomcat-7.0.37/conf/server.xml

在最后的 </Host> 里添加

<!--增加的静态资源映射配置--><Contextpath="/uploads"docBase="/Users/liuyanzhao/Documents/uploads"reloadable="true"crossContext="true"></Context>

如图

如图,这张图片的 url 是

/uploads//11/113022393913.jpg

http://localhost:8090/uploads//11/113022393913.jpg

本文链接:/6833.html

如果觉得《SpringMVC实现ajax上传图片实时预览》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。