`
843977358
  • 浏览: 246845 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringMVC 实现文件下载

阅读更多

我们要用学会优雅的方式解决看似"复杂"的问题

  •     作为程序员,可能会在不经意间就写出来了一段让自己感到骄傲、欣喜、自豪的垃圾代码。对!就是垃圾代码,此处不需要引号!这种情况是可悲的,更可悲的是你自己一直无法发现自己的垃圾之处!我们如果想成长,想在编程的路上走下去,第一个资本就是要:学会、习惯、坚持写优雅的高效的健壮的代码。这个过程不是一触而就的,只能在日常的小事中,自己编写的一段段小的代码中慢慢改进。
                                                                                                                                            一只倔强的猴子的自白

OK,学习不要太严肃,以上只是自己的一点感想, 也算是对自己今后的码路的一点意见、提醒。各位童鞋不是来听我谈理想的,俗话说得好“总是和老子谈理想的人都不是好人,要想和老子谈就谈钱”!
图片描述
今天说的问题是关于文件上传的,我这些天在弄一个自己的小项目,使用SSM框架和MySQL数据库,项目中有文件上传和下载的功能。OK!先看一段代码:

/**
     * @Description 下载文件
     * @author zhangyd
     * @date 2015年12月7日 上午10:34:23
     * @param response
     * @param file
     */publicstaticvoid downLoadFile(HttpServletResponse response,File file){if(file ==null||!file.exists()){return;}OutputStreamout=null;try{
            response.reset();
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setHeader("Content-Disposition","attachment; filename="+ file.getName());out= response.getOutputStream();out.write(FileUtils.readFileToByteArray(file));out.flush();}catch(IOException e){
            e.printStackTrace();}finally{if(out!=null){try{out.close();}catch(IOException e){
                    e.printStackTrace();}}}}

这段代码,各位看官感觉如何?其实在之前的servlet中,这种实现方式也是无可厚非的,也算是比较普遍的一种实现方式。
但是!!!今天在慕课群里聊天时,@慕男神的一句话提醒到了我。我上面提到了,我用到的是SSM框架,既然用了Spring MVC为什么还要暴露这种HttpServletResponse j2ee的接口用作实现下载功能呢?Spring 应该提供了更好的实现方式。OK,开始查资料...

结果...

真TM让我找到了图片描述
上代码:

/**
     * @Description 下载文件
     * @author zhangyd
     * @date 2015年12月11日 下午6:11:33 
     * @param fileName
     * @param file
     * @return
     * @throws IOException
     */publicResponseEntity<byte[]> download(String fileName,File file)throwsIOException{String dfileName =newString(fileName.getBytes("gb2312"),"iso8859-1");HttpHeaders headers =newHttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", dfileName);returnnewResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers,HttpStatus.CREATED);}

代码很简洁,逻辑很严谨(我这是屁话),实现很优雅......
图片描述图片描述
简单看了下源码里的实现方式...

publicclassHttpHeadersimplementsMultiValueMap<String,String>,Serializable{privatestaticfinallong serialVersionUID =-8578554704772377436L;privatestaticfinalString ACCEPT ="Accept";privatestaticfinalString ACCEPT_CHARSET ="Accept-Charset";privatestaticfinalString ALLOW ="Allow";privatestaticfinalString CACHE_CONTROL ="Cache-Control";privatestaticfinalString CONNECTION ="Connection";privatestaticfinalString CONTENT_DISPOSITION ="Content-Disposition";privatestaticfinalString CONTENT_LENGTH ="Content-Length";privatestaticfinalString CONTENT_TYPE ="Content-Type";privatestaticfinalString DATE ="Date";privatestaticfinalString ETAG ="ETag";...
static{
        ALL = valueOf(ALL_VALUE);
        APPLICATION_ATOM_XML = valueOf(APPLICATION_ATOM_XML_VALUE);
        APPLICATION_FORM_URLENCODED = valueOf(APPLICATION_FORM_URLENCODED_VALUE);
        APPLICATION_JSON = valueOf(APPLICATION_JSON_VALUE);
        APPLICATION_OCTET_STREAM = valueOf(APPLICATION_OCTET_STREAM_VALUE);
        APPLICATION_XHTML_XML = valueOf(APPLICATION_XHTML_XML_VALUE);
        APPLICATION_XML = valueOf(APPLICATION_XML_VALUE);
        IMAGE_GIF = valueOf(IMAGE_GIF_VALUE);
        IMAGE_JPEG = valueOf(IMAGE_JPEG_VALUE);
        IMAGE_PNG = valueOf(IMAGE_PNG_VALUE);
        MULTIPART_FORM_DATA = valueOf(MULTIPART_FORM_DATA_VALUE);
        TEXT_HTML = valueOf(TEXT_HTML_VALUE);
        TEXT_PLAIN = valueOf(TEXT_PLAIN_VALUE);
        TEXT_XML = valueOf(TEXT_XML_VALUE);}
/**
     * A String equivalent of {@link MediaType#APPLICATION_OCTET_STREAM}.
     */publicfinalstaticString APPLICATION_OCTET_STREAM_VALUE ="application/octet-stream";
/**
     * Set the given, single header value under the given name.
     * @param headerName  the header name
     * @param headerValue the header value
     * @throws UnsupportedOperationException if adding headers is not supported
     * @see #put(String, List)
     * @see #add(String, String)
     */@Overridepublicvoidset(String headerName,String headerValue){List<String> headerValues =newLinkedList<String>();
        headerValues.add(headerValue);
        headers.put(headerName, headerValues);}

此处只简单看了一下源码实现方式,大体上实现方式差不多,只是让Spring封装了一遍,显得更严谨一点。具体的源码,各位有兴趣去Spring官网查看吧...
图片描述自己动手丰衣足食
最后,附上一点点关于这方面的问题:
使用这种方式需要修改下application配置文件:

<!-- 设置json和response的字符编码 --><beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><propertyname="messageConverters"><list><beanclass="org.springframework.http.converter.ByteArrayHttpMessageConverter"/><refbean="stringHttpMessageConverter"/></list></property></bean><beanid="stringHttpMessageConverter"class="org.springframework.http.converter.StringHttpMessageConverter"><propertyname="supportedMediaTypes"><list><value>text/plain;charset=UTF-8</value></list></property></bean>

这个是配置response的字符编码的,如果不配置,可能会出现乱码等一系列问题。

OK...图片描述

 

分享到:
评论

相关推荐

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    IDEA SpringMVC 实现文件的上传下载

    在SpringMVC框架中,实现文件的上传与下载是常见的需求。IntelliJ IDEA作为流行的Java开发集成环境,为开发者提供了高效便捷的开发体验。在这个项目中,我们使用IDEA来构建一个基于SpringMVC的系统,实现了文件的...

    springmvc实现demo

    在本项目"springmvc实现demo"中,我们将探讨如何使用 Spring MVC 实现Web应用,包括注解和非注解两种方式,并且数据库环境为 MySQL。 1. **Spring MVC 架构** Spring MVC 提供了一个分层架构,主要包括 ...

    SpringMVC实现文件下载功能

    SpringMVC实现文件下载功能详解 在本文中,我们将详细介绍如何使用SpringMVC框架实现文件下载功能。文件下载是Web应用程序中的一种常见功能,用于提供用户下载文件的能力。本文将从基本概念到实现细节,全方位介绍...

    JavaEE企业级开发-----SpringMVC实现 文件的上传下载实验报告.docx

    本实验报告将详细阐述如何利用SpringMVC实现文件上传与下载的功能。 首先,文件上传的核心在于HTML表单(form)的正确配置。在创建用于上传文件的表单时,需要指定`enctype`属性为`multipart/form-data`。这是因为...

    SpringMVC 实现文件上传下载、国际化等

    本教程将深入讲解如何利用SpringMVC实现文件上传和下载功能,以及如何实现应用的国际化。下面我们将详细探讨这些知识点。 **一、SpringMVC文件上传** 在SpringMVC中,文件上传主要依赖于`CommonsMultipartResolver...

    springmvc文件下载

    本篇将详细探讨如何利用SpringMVC结合EasyUI实现文件下载功能,并着重讲解SpringMVC中的注解技术。 首先,SpringMVC是Spring框架的一部分,它提供了模型-视图-控制器(MVC)架构模式的实现,简化了Java Web应用程序...

    SpringMVC+Hibernate+EXT

    【SpringMVC】 SpringMVC是Spring框架的一部分,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)架构。SpringMVC通过将业务逻辑、控制逻辑和显示逻辑分离,提高了代码的可维护性和可测试性。在...

    SpringMVC实现文件上传下载

    以下将详细介绍如何利用SpringMVC实现文件上传、下载以及文件列表展示和删除。 **一、文件上传** 1. **配置MultipartResolver**:SpringMVC默认不支持文件上传,我们需要添加`CommonsMultipartResolver`作为解析器...

    netty整合SpringMVC实现下载

    通过以上步骤,我们可以利用 Netty 的高性能特性处理网络通信,结合 SpringMVC 的 MVC 模式来处理业务逻辑,实现高效的文件下载服务。这种整合方式尤其适用于大文件下载或高并发场景,能充分利用硬件资源,提升用户...

    SpringMVC框架实现文件的上传和下载

    在SpringMVC框架中,文件的上传和下载是常见的功能需求,主要用于处理用户的数据交互,例如用户上传图片、文档等,或者系统提供文件下载服务。本文将深入探讨如何使用SpringMVC来实现这一功能。 首先,我们需要理解...

    基于easyui+springmvc实现的文件管理系统

    【标题】:“基于EasyUI+SpringMVC实现的文件管理系统” 在现代企业信息化管理中,文件管理系统扮演着至关重要的角色,它能够有效地组织、存储、检索和管理企业内部的各类文档,提高工作效率,保证信息的安全性。本...

    Spring下的子框架SpringMVC实现单个文件上传功能

    在开始实现文件上传功能之前,我们需要做一些准备工作,包括添加必要的依赖、配置文件上传解析器等。 ##### 1. 添加依赖 为了支持文件上传,首先需要在项目的构建文件(如`pom.xml`或`build.gradle`)中添加`...

    SpringMVC demo 完整源码实例下载.zip

    SpringMVC提供MultipartFile接口处理文件上传,而文件下载则可以通过StreamingResponseBody或者直接返回文件路径实现。这些功能的实现涉及了流处理和响应头设置,确保了文件传输的正确性和效率。 异常处理在Web应用...

    SpringMVC上传下载异常处理

    本文档主要介绍了SpringMVC的ModelAndView机制,使用SpringMVC实现文件上传,下载以及全局异常处理机制

    SpringMVC文件增删改查(上传、更新、下载、删除)

    在SpringMVC框架中,文件操作是常见的功能需求,包括文件的上传、下载、更新和删除。本项目提供了完整的解决方案,覆盖了这些功能点。以下将详细解释这些知识点。 一、文件上传 在SpringMVC中,文件上传主要依赖于`...

    springmvc实现的简单用户管理系统

    本项目是使用SpringMVC实现的一个简单的用户管理系统,非常适合初学者学习和理解SpringMVC的工作原理。 1. **SpringMVC基本架构** SpringMVC的核心组件包括DispatcherServlet(前端控制器)、HandlerMapping...

    springMVC文件下载代码

    在这个实例中,我们将探讨如何在SpringMVC中实现文件的下载功能。文件上传和下载是Web应用中常见的需求,对于用户交互和数据交换至关重要。 首先,我们需要理解SpringMVC的工作原理。它基于Model-View-Controller...

    SocketIo+SpringMvc实现文件的上传下载

    socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载

    springmvc框架的文件上传 下载

    在这个项目"springmvc框架的文件上传 下载"中,你可能会遇到如404错误等常见问题,下面将详细介绍SpringMVC中文件上传和下载的实现及其可能遇到的问题。 **文件上传** 1. **配置**: 首先,你需要在`dispatcher-...

Global site tag (gtag.js) - Google Analytics