上传文件和下载文件是个常用的技能,在哪里开发几乎都能遇见,而所有的上传控件各不相同,插件很多,后台也有很多,这里我只尝试过这个方法觉的还够简洁。具体如下实现:

1、spring-mvc.xml配置  添加如下,下划线的是关键

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 自动扫描且只扫描@Controller -->
<context:component-scan base-package="com.oasis.wyvern" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<context:annotation-config/>
<context:component-scan base-package="com.oasis.wyvern.res.controller"/>
<bean id="ignorTypeInfoJacksonAnnotationIntrospector" class="com.oasis.wyvern.res.utils.jackson.JsonMapper.IgnorTypeInfoJacksonAnnotationIntrospector">
</bean> <mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="serializationInclusion">
<value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
</property>
<property name="annotationIntrospector" ref="ignorTypeInfoJacksonAnnotationIntrospector"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven> <!--websocket 配置-->
<bean id="websocket" class="com.oasis.wyvern.res.controller.websocket.WebsocketEndPoint"/>
<websocket:handlers allowed-origins="*">
<websocket:mapping path="/websocket" handler="websocket"/>
<websocket:handshake-interceptors>
<bean class="com.oasis.wyvern.res.controller.websocket.HandshakeInterceptor"/>
</websocket:handshake-interceptors>
</websocket:handlers> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean> <!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>

<!-- 处理所有的无RequestMapping和静态内容的URL -->
<mvc:default-servlet-handler/>
<!-- 定义无需Controller的url<->view直接映射 -->
<mvc:view-controller path="/core/404" view-name="/core/404"/>
<mvc:view-controller path="/core/refresh" view-name="/core/refresh"/>
<mvc:view-controller path="/core/error" view-name="/core/error"/> <!--<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.oasis.crm.controller.ziwei.core.formtoken.FormTokenInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>--> <!-- Shiro 注解AOP -->
<!-- Enable Shiro Annotations for Spring-configured beans. Only run after -->
<!-- the lifecycleBeanProcessor has run: -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean> </beans>

2、controller上传      

    /**
* 创建文件
* @return
*/
@RequestMapping(CREATE) //ajax请求的url
@ResponseBody
public PackVo<Boolean> createAttachment(MultipartFile file ){
String uuid = UuidUtils.getUUID();
attachmentService.createAttachment(file,uuid);
PackVo<Boolean> packVo = new PackVo<>();
packVo.setVo(Boolean.TRUE);
packVo.setUdf2(uuid);
return packVo; //controller返回值可看配置 可直接换为String
}

3、文件上传后处理保存在服务器,或hbase

  private Attachment generateAttachment(MultipartFile file, String uuid) throws IllegalStateException, IOException {
Calendar calendar = Calendar.getInstance();
String toMonth = DateUtil.dateFormat(calendar.getTime(), "yyyyMM");
String toDay = DateUtil.dateFormat(calendar.getTime(), "yyyyMMdd");
toDay = toDay.substring(6);
String path = "d:/attachment/" + toMonth + "/" + toDay + "/";
String myFileName = file.getOriginalFilename();
// String noPostfixFileName = myFileName.substring(0,myFileName.indexOf("."));
FileManageUtil.makeDirectory(path);
path += myFileName;
File localFile = new File(path);
file.transferTo(localFile);
Attachment attachment = new Attachment();
attachment.setName(myFileName);
attachment.setAttachmentUrl(path);
attachment.setFileSize(Float.parseFloat(file.getSize()+""));
attachment.setUuid(uuid);
return attachment; }

二、1、文件下载

  @RequestMapping(value=DOWNLOAD)
public ResponseEntity<byte[]> testResponseEntity(String realName,String path) throws IOException {
byte[] body = null;
File f = new File(path);
InputStream in = new FileInputStream(f);
body = new byte[in.available()];
in.read(body);
in.close();
HttpHeaders headers = new HttpHeaders();
//响应头的名字和响应头的值
headers.add("Content-Disposition", "attachment;filename="+new String(realName.getBytes("UTF-8"),"iso-8859-1"));//解决文名称中文乱码
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
return response;
}

2、前台实现下载,上传就略去了,reactjs写法

  return (
<div>
{
this.state.initialObj.attachmentVoList.map((attachment)=> {
return (
<div key={attachment.id} className="attachment-list">
<a>{attachment.name} </a>&nbsp;&nbsp;&nbsp;
<a href={Remote.cert.download+'?path='+attachment.attachmentUrl+'&realName='+attachment.name} >下载 </a>
<span className="ant-divider" />
<Popconfirm title="您确定删除吗?" onConfirm={this.deleteData.bind(this, attachment.id)}>
<a >删除</a>
</Popconfirm>
</div>
)
})
} </div>
)

springMVC实现文件上传下载的更多相关文章

  1. SSM框架-SpringMVC 实例文件上传下载

    一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...

  2. 14.SpringMVC之文件上传下载

    SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...

  3. SpringMVC的文件上传下载,异常处理,拦截器的小总结

    文件的上传和下载 我们通常在访问网页时会使用到文件的上传与下载的功能,那么他是如何实现的呢? 1 下载: ResponseEntity :用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览 ...

  4. SpringMVC异步文件上传下载

    首先了解一下File的构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子文件/ ...

  5. SpringMVC文件上传下载(单文件、多文件)

    前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...

  6. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

  7. 使用springMVC实现文件上传和下载之环境配置与上传

    最近的项目中用到了文件的上传和下载功能,任务分配给了其他的同时完成.如今项目结束告一段落,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 一. 基础配置: maven导包及配置pom.x ...

  8. SpringMVC 文件上传下载

    目录 文件上传 MultipartFile对象 文件下载 上传下载示例 pom.xml增加 创建uploadForm.jsp 创建uploadForm2.jsp 创建userInfo.jsp spri ...

  9. springmvc文件上传下载简单实现案例(ssm框架使用)

    springmvc文件上传下载实现起来非常简单,此springmvc上传下载案例适合已经搭建好的ssm框架(spring+springmvc+mybatis)使用,ssm框架项目的搭建我相信你们已经搭 ...

随机推荐

  1. 最初的ajax案例

    ----------------------原始的ajax: function guo() {            var xhr            if (XMLHttpRequest) {  ...

  2. 企业架构研究总结(45)——企业架构与建模之使用ArchiMate进行分析(全系列完)

    4. 使用ArchiMate进行分析 正如前面所说的那样,一个企业整体效率的提升有时并不是通过某一个领域内的优化就能达到的,而且这种忽视全局的做法往往还会造成不必要的浪费.由此可见,一个能够跨越各个领 ...

  3. 企业架构研究总结(37)——TOGAF企业连续体和工具之架构资源库及架构工具的选择

    3. 架构资源库 在一个企业,尤其是在一个大型企业中,建设一个成熟的架构往往会产生大量的工作产品.为了很好地管理和利用这些工作产品,企业需要制定一个正式的针对不同类型架构资产的分类方法,并且还需要专门 ...

  4. 关于Grunt可视化的尝试

    关于Grunt可视化的尝试 使用Grunt遇到的问题? 必须要安装NodeJS 必须安装grunt-cli 需要编写复杂的Gruntfile.js规则 每个项目中必须存在nodejs的grunt模块 ...

  5. wcf传输Dataset大数据量 -压缩(一)

    wcf传输Dataset大数据量 -压缩(一) 由于WCF不能传输DataTable(不能序列化),所以更多项目中都会使用DataSet作为查询集合的首选返回类型,但是由于DataSet会生成很多的状 ...

  6. HTTP header 介绍

    HTTP(Hyper Text Transfer Protocol)是超文本传输协议的缩写,它用于传送www方式的数据.HTTP协议采用了请求/响应模型.客服端向服务器发送一个请求,请求头包含请求的方 ...

  7. 基于BrokerPattern服务器框架

    基于BrokerPattern服务器框架 RedRabbit 经典网游服务器架构 该图省略了专门用途的dbserver.guildserver等用于专门功能的server,该架构的优点有: l Log ...

  8. html5基础的常用的技巧

    html5基础的常用的技巧 1. 新的Doctype声明 XHTML的声明太长了,我相信很少会有前端开发人员能手写出这个Doctype声明. <!DOCTYPE html PUBLIC &quo ...

  9. Left 、right join使用笔记

    用过很多次left join,right join,看到查询出的结果,知道可能是没用left join.或者right join导致的结果,但都是用一次,网上查一次使用规则,学到的东西只是皮毛.今天用 ...

  10. 通过VNC Viewer使用VMware虚拟机的远程桌面连接

    本文转自:http://www.14blog.com/archives/185 要在VMware虚拟机中使用远程桌面连接?方法有两个:一种是在虚拟机中做“端口映射”,当然,这个稍显复杂(虚拟机端口映射 ...