精华内容
下载资源
问答
  • 这是关于springMVC文件上传下载的相关jar包,其中包括springMVCjar包,commons-fileupload组件的jar包和JSTL的相关jar包
  • 文章目录一、SpringMVC支持文件下载二、SpringMVC支持文件上传1.导入文件上传的两个jar包2.index.jsp前端页面3.配置文件上传解析器4.文件上传请求处理三、多文件上传 一、SpringMVC支持文件下载 假设要下载项目中的...
  • SpringMvc 文件上传下载

    2018-03-18 00:24:50
    使用SpringMvc框架写的一个简单的文件上传下载功能,我已经测试过了功能完全没问题。
  • SpringMVC文件上传下载的实现,实际开发过程中由于使用的Spring版本比较低的,所以一些最新的注解以及方法不能使用,然后使用了一些替代的方法,另外在项目中使用到的路径是从内存中读取的并不是项目路径,具体的...
  • SpringMVC 文件上传下载

    2017-02-23 17:59:38
    上传下载 的 demo 可以自定义路径上传下载,和虚拟路径上传下载,此项目代码中有详细的注释,欢迎大家使用,也欢迎大家提出宝贵的意见和建议
  • SpringMVC文件上传下载

    2014-01-10 17:54:22
    SpringMVC文件上传下载 @Controller @RequestMapping(value="/file") public class FileController { @Resource private User user; @RequestMapping(value="/toUpload") public String toUpload(){ return...
  • 本人写的上传下载demo 一会儿博客里面会有提到 亲们可以先看看然后在下载
  • SpringMVC框架实现文件上传下载

    热门讨论 2017-04-05 13:50:56
    SpringMVC框架实现文件上传下载项目案例源码
  • SpringMVC文件上传下载(包括单一文件与多文件上传,两种下载方式)
  • 本文主要目的是记录自己基于SpringMVC实现的文件上传下载的工具类的编写,代码经过测试可以直接运行在以后的项目中。开发的主要思路是对上传下载文件进行抽象,把上传下载的核心功能抽取出来分装成类。
  • springmvc 文件上传下载

    2014-12-27 19:04:19
    springmvc3基于注解方式实现的文件上传下载,多种方式实现
  • 这里是由Intelli IDEA 搭建的SpringMVC 系统, 实现了简单的文件上传下载功能
  • 主要为大家详细介绍了SpringMVC下实现Excel文件上传下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • springMVC文件上传下载分页拦截器,使用的是Spring+springMVC+hibernate框架
  • springmvc实现文件上传下载,里面有2个页面,一个是上传页面,一个是下载列表页面,用的是springmvc控制器,比较简单实现,欢迎下载
  • SpringMVC实现文件上传,需要再添加两个jar包。一个是文件上传的jar包,一个是其所依赖的IO包。这两个jar包,均在Spring支持库的org.apache.commons中。 1.2 书写控制器方法  FileUpController.java 完整 @...

    1  实现步骤

    1.1 引入核心JAR包

    SpringMVC实现文件上传,需要再添加两个jar包。一个是文件上传的jar包,一个是其所依赖的IO包。这两个jar包,均在Spring支持库的org.apache.commons中。


    1.2 书写控制器方法

     FileUpController.java 完整

    @Controller
    public class FileUpController {
    
    	@RequestMapping("/")
    	public String index() {
    		return "index";
    	}
    	
    	@RequestMapping(value="upload",method=RequestMethod.POST)
    	public String upload(MultipartFile myFile,Model model,HttpServletRequest request) {
    	
    		//获取上传图片存储目录
    		String path = request.getSession().getServletContext().getRealPath("upload");
    		System.out.println(path);
    		//获取文件名并使用UUID生成新文件名
    		String fileName  = myFile.getOriginalFilename();
    		String newFileName = UUID.randomUUID()+fileName.substring(fileName.lastIndexOf("."));
    		//在指定上传存储目录中创建新文件
    		File targetFile = new File(path,newFileName);
    		//找不到指定上传图片存储目录,就新创建此目录
    		if(!targetFile.exists()) {
    			targetFile.mkdirs();
    		}
    		//将文件写入硬盘
    		try {
    			myFile.transferTo(targetFile);
    		} catch (IllegalStateException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//将上传后的文件路径传到view
    		model.addAttribute("fileUrl", request.getContextPath()+"/upload"+newFileName);
    		
    		return "upload";
    	}
    	
    	
    }
    

     


    applicationContext.xml:

    注:必须创建MultipartFile实例。要不出现500错误


    index.jsp页面:需指定 enctype="multipart/form-data 

    <body>
    
       <form action="${pageContext.request.contextPath }/first.do" method="post" enctype="multipart/form-data">
    
       <h2>文件上传</h2>
    
                    文件:<input type="file" name="uploadFile"/><br/><br/>
    
          <input type="submit" value="上传"/>
    
       </form>
    
     </body>


     实现效果:  


    2  没有选择要上传的文件&&限制文件上传类型

     如果没有选择要上传的文件,可以通过如下判断代码回到错误页,并配置异常类

    <!-- 配置异常类  报错 -->
    
        <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    
        <property name="defaultErrorView" value="/error.jsp"></property>
    
        </bean>


     


    3  多文件上传 

     

    实现效果:


    4  文件下载

     

    	
    <a href="${pageContext.request.contextPath }/download.do?line.jpg">下载</a>

    DownloadControll.java 完整 

    @Controller
    public class DownloadController {
        @RequestMapping(value="download",method=RequestMethod.GET)
        public ResponseEntity<byte[]> download(String filename,HttpServletRequest request)throws Exception {
            //下载文件路径
            String path = request.getServletContext().getRealPath("upload");
            File file = new File(path + "/" + filename);
            //开始设置http请求头
            HttpHeaders headers = new HttpHeaders();  
            //下载显示的文件名,解决中文名称乱码问题  
            String downloadFileName = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
            //通知浏览器以attachment(下载方式)打开文件。
            headers.setContentDispositionFormData("attachment", downloadFileName); 
            //设置mime:application/octet-stream : 二进制流数据(最常见的文件下载)。
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            return new ResponseEntity<byte[]>(
                           FileUtils.readFileToByteArray(file),    //把一个文件转换成字节数组返回
                           headers,                                                //http请求头
                           HttpStatus.OK                                      //200
                       );  
        }
    }
    
    

     实现效果:

    项目源码下载--->>工程源码下载 

    展开全文
  • SpringMvc文件上传下载

    万次阅读 多人点赞 2016-08-23 13:46:17
    最近博主在做SpringMvc文件上传下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看.  ...

    最近博主在做SpringMvc文件上传和下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看.

              http://pan.baidu.com/s/1o7Oo4NC 原码下载

    首先需要导入jar包:

    然后,在applicatinContext.xml中添加上传和下载的配置文件,如下:

     <!-- 文件上传的配置 -->
    	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">   
            <!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->   
            <property name="maxUploadSize" value="200000"/>   
        </bean>   
          
        <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->   
        <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">   
            <property name="exceptionMappings">   
                <props>   
                    <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到WebContent目录下的error.jsp页面 -->   
                    <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error</prop>   
                </props>   
            </property>   
        </bean>

    好了,最基础的配置就好了,接下来jsp页面:upload.jsp

     

    <form action="upload.do" method="post" enctype="multipart/form-data">
             文件1: <input type="file" name="myfiles"/><br/>   
              文件2: <input type="file" name="myfiles"/><br/>   
              文件3: <input type="file" name="myfiles"/><br/>   
       		<input type="submit" value="上传">
    </form>

    Controller中对应的java代码:

    	@RequestMapping("/upload.do")
    	public String upload(@RequestParam MultipartFile[] myfiles, HttpServletRequest request) throws IOException {
    		for (MultipartFile file : myfiles) {
    			// 此处MultipartFile[]表明是多文件,如果是单文件MultipartFile就行了
    			if (file.isEmpty()) {
    				System.out.println("文件未上传!");
    			} else {
    				// 得到上传的文件名
    				String fileName = file.getOriginalFilename();
    				// 得到服务器项目发布运行所在地址
    				String path1 = request.getSession().getServletContext().getRealPath("image") + File.separator;
    				// 此处未使用UUID来生成唯一标识,用日期做为标识
    				String path = path1 + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + fileName;
    				// 查看文件上传路径,方便查找
    				System.out.println(path);
    				// 把文件上传至path的路径
    				File localFile = new File(path);
    				file.transferTo(localFile);
    			}
    		}
    		return "uploadSuccess";
    	}

    这样就可以把网页上选择的图片上传上去了

     

     

    下载成功了!

     

    文件下载

    (文件下载我是参照网上一位前辈的,在此注明他的博客网址:http://my.oschina.net/u/1394615/blog/311307):

    download.jsp:此处为了测试,我直接把文件名当作参数传过去:

    <a href="download.do?fileName=2016082312271111111.jpg">下载</a> 

    Controller:

     

    	@RequestMapping("/download")
    	public String download(String fileName, HttpServletRequest request, HttpServletResponse response) {
    		response.setCharacterEncoding("utf-8");
    		response.setContentType("multipart/form-data");
    		response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
    		try {
    			String path = request.getSession().getServletContext().getRealPath("image") + File.separator;
    			InputStream inputStream = new FileInputStream(new File(path + fileName));
    
    			OutputStream os = response.getOutputStream();
    			byte[] b = new byte[2048];
    			int length;
    			while ((length = inputStream.read(b)) > 0) {
    				os.write(b, 0, length);
    			}
    
    			// 这里主要关闭。
    			os.close();
    
    			inputStream.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		// 返回值要注意,要不然就出现下面这句错误!
    		// java+getOutputStream() has already been called for this response
    		return null;
    	}


    OK,springmvc的上传下载就完成了!

     

    展开全文
  • SpringMVC文件上传下载实战(单文件、多文件)

    千次阅读 多人点赞 2020-07-30 20:03:27
    大家好,我是bigsai,今天我们学习Springmvc的文件上传下载。文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一。本文为你揭开SpringMVC文件上传下载的面纱!

    前言

    大家好,我是bigsai,今天我们学习Springmvc的文件上传下载。

    文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一。你可能经常在网页上传下载文件,你可能也曾沉浸于互联网技术的神秘,而本篇就为你解开它神秘的面纱。

    本文已收录在公众号:bigsai中(微信搜索bigsai),,同时也收录在博学谷中(以关卡方式展开欢迎体验),更多好玩精彩等待给您分享,欢迎关注!

    案例分析

    你肯定会问:通过本篇可能能够学到什么?

    那我很负责任的告诉你,通过本篇文章,你能够掌握Springmvc文件上传(单文件、多文件)文件下载知识和内容的使用,并能够根据这些实现一些基本的案例。

    核心思路拆解

    你可能会问:,这么一个完整的项目是如何分工运行?

    不急不急,我来告诉你,其实这么一个文件上传下载的项目,它是一个b-s结构的web项目,涉及到前端和服务端,从宏观来看它是这样的一个结构:

    在这里插入图片描述

    但是从文件上传、下载两个功能来看它们之间又是有所区别的,文件上传的主要核心是用户上传的文件服务端接受存储

    在这里插入图片描述

    而文件下载更重要的部分是用户请求之后服务端给用户返回二进制文件

    在这里插入图片描述

    所以文件上传和文件下载的项目大体结构相似,只是各个部分在具体实现上有差别,我们需要更多关注下文件上传和下载服务端的实现和区别。

    案例所涉及知识点

    在本案例中,用到了以下知识点:

    html页面form表单:

    在前端无论是html还是jsp等模板引擎编写上传的页面时候。<form> 标签就意为一个(文件)上传的表单。

    • 表单能够包含若干 input 标签,而input标签又有不同类型比如文本字段、复选框、单选框、文件等等。
    • 我们通常使用表单编写若干标签代表我们想要向服务端发送的数据,然后通过标签的按钮将数据请求提交至服务端。
    • 表单的method表示请求的类型(一般为post),action表示需要请求的url地址,enctype表示传输数据类型。

    Springmvc:

    案例的文件上传和下载基于Springmvc,而我们在Springboot项目中整合Springmvc。

    • 本案例使用Springmvc作为项目mvc架构的框架,将模型(Model),视图(View),控制器(Controller)分离降低项目的耦合性。
    • 本案例使用Springmvc的MultipartFile接口和ResponseEntity接口实现文件上传和下载。

    创建Springmvc项目

    Springmvc为一个mvc架构的web框架,创建Springmvc项目的方式有很多,你可以选择直接通过IDEA创建Springmvc项目,也可以通过Maven方式创建web项目然后添加Springmvc的依赖,但这两种方式有太多的配置还需要配置tomcat,在效果一致的情况下咱们尽量简化一些开发配置类的工作,所以不采用以上两种方式创建项目。

    而Springboot简化了Spring项目的开发,开箱即用,且内嵌tomcat,所以咱们选择创建基于Springboot且整合Springmvc的项目方便快捷,更能直奔主题进行操作。

    项目创建

    首先,打开IDEA,创建项目,选择Spring Initializr类型初始化点击next。
    在这里插入图片描述
    然后你会得到一个选择项目名和一些配置的页面,我们在Group中填写com,而Artifact咱们填写fileupload。点击next。
    在这里插入图片描述
    接着在选择对应模块依赖的时候,选择Spring web 模块,此模块就是包含Springmvc的web模块
    在这里插入图片描述
    接着选择需要创建项目的地址目录,点击next在这里插入图片描述

    这样你就可以得到一个完整的包含web模块(Springmvc)的Springboot项目,就可以在里面编写咱们项目的代码。
    在这里插入图片描述

    目录介绍

    上面创建完的基于Springboot的Springmvc项目,默认有若干文件和文件夹,不同文件和文件夹有着不同的职责:

    • java:用来编写java服务端相关代码,例如Controller,Dao,Service等。
    • application.properties: 编写一些项目和框架的配置内容以及和第三方框架整合配置等
    • static: 静态资源目录,用来存放html、JavaScript、图片等资源。
    • teamplates:用来编写Thymeleaf等模板引擎,这里不使用
    • pom.xml:编写maven项目jar包资源依赖。如果项目需要引入其他依赖或者修改打包方式可以进行修改。

    对于web项目的文件上传,需要进行一定配置以满足我们的使用需求,我们在application.propertis进行以下配置:

    # 允许项目中文件上传
    spring.servlet.multipart.enabled=true
    # 上传文件的临时目录 (一般情况下不用特意修改)
    #spring.servlet.multipart.location=
    # 上传文件最大为 1M (默认值 1M 根据自身业务自行控制即可)
    spring.servlet.multipart.max-file-size=104857600
    # 上传请求最大为 10M(默认值10M 根据自身业务自行控制即可)
    spring.servlet.multipart.max-request-size=104857600
    # 文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,(默认值0 一般情况下不用特意修改)
    spring.servlet.multipart.file-size-threshold=0
    # 判断是否要延迟解析文件(相当于懒加载,一般情况下不用特意修改)
    spring.servlet.multipart.resolve-lazily=false
    

    当然,你对文件有大小等其他要求可以对配置进行自行更改。到这里带有Springmvc环境的项目已经创建完成啦,剩下的只需要编写前端、服务端代码运行测试即可。

    单文件上传

    下面请跟我实战 Springmvc单文件上传。一个完整的文件上传项目有两部分组成:前端界面和服务端程序。

    前端设计

    对于前端页面,我们使用你一定熟悉的html而不选用其他模板引擎。而form表单是html文件上传的核心组件,你在使用前需要了解它的一些属性。

    表单的enctype属性
    上面说了一个表单文件传输的大体流程,你也知道表单有个至关重要的属性:enctype。而entype值通常有以下三种:

    • application/x-www-form-urlencoded:默认编码方式,在发送前编码所有字符(默认)使用url编码方式,和get请求有些相似。但这种方式如果发送大量二进制数据效率会比较低。
    • multipart/form-data:不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。通常用来向服务端发送二进制数据,而我们的文件也主要以二进制的方式进行传输。
    • text/plain:空格转换为 “+” 加号,但不对特殊字符编码。

    所以本单文件上传案例中,需要注意以下事项:

    • 表单的enctype要为multipart/form-data类型,表示二进制传输。
    • 在一个form表单内定义一个input为file属性的标签,代表文件上传。
    • form表单的method需要为post。
    • enctype要为multipart/form-data类型,表示二进制传输。

    前端页面的规则了解之后你在static下创建一个index1.html文件,里面具体的代码内容为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>单文件上传</title>
    </head>
    <body>
    <h2>单文件上传</h2>
    <form  action="onfile" method="post" enctype='multipart/form-data'>
        <input type="file" name="file" ><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    其中action="onfile"代表的为请求地址为onfile,这里都在项目内所以用相对地址即可,如果上传为其他接口也可填写对应的绝对地址。这样前端页面就编写完成,我们还需要编写文件上传对应服务端模块。

    服务端设计

    服务端主要负责文件接受,在前端看起来实现文件上传的页面很简单,但实际上在服务端的文件接收并没有那么容易,因为传过来的不光光是这一个(或多个)二进制文件,还附带一些头信息、文件名等等数据。打包过来的数据如果是文本数据解析可能还好,但是二进制文件数据一旦出现一点错误可能得到的整个文件都是损坏的。并且在咱们java web技术栈中文件上传也是有一定发展的历史的:

    servlet文件上传(3.0以前)
    在servlet3.0以前,文件上传在服务端接收需要使用request.getInputStream()获取表单的二进制数据,但是在解析时候非常麻烦和复杂,对于文件上传这么一个很基本的模块在接收的时候可能要耗费很大的成本和精力去解决它,并且很多初级攻城狮很可能由于对io模块陌生无法实现上传文件在服务端的接收。
    在这里插入图片描述

    所以这个时候一些具有责任感的公司、组织就把它们的解析方法贡献出来供大家使用,大家不需了解传输文件底层内容,这些开源的处理方式中,最流行的当属apache旗下开源的commons-fileuploadcommons-io,把两个jar包加入到项目中你直接了解下这个api如何使用即可。有了这两个jar包,简单学习它的api,你就可以在普通的web项目中很容易的实现上传文件的功能!
    在这里插入图片描述
    servlet3.0以后
    随着servlet版本更新,设计者可能看到javaweb开发中原生api对文件上传支持不太友好的问题,所以在api对文件上传的支持得到优化,简化了Java Web的开发。在servlet3.0中主要增加Part这个类用来读取文件数据和信息,在Part中直接将传输文件的名称、头信息、二进制文件分割开,通过简单的api就可以实现文件上传的功能。不需要再添加外部jar包

    Springmvc文件上传
    文件上传和下载是web开发常用模块,而Springmvc作为一款优秀的web框架,对很多模块和内容进行更高度的封装和集成,而这么常用的文件上传肯定是少不了的,所以Springmvc的文件上传基于apache旗下开源的commons-fileuploadcommons-io包。将其进行二次集成和封装至Springmvc,将方法和内容封装至MultipartFile接口让我们使用起来更加方便,能够容易实现单文件、多文件上传。

    对于上述各种文件上传服务端实现方式,大致可以通过下图展示:
    在这里插入图片描述
    通过上图你就可明白Springmvc文件上传实现的原理,那么下面你就可以进行大显身手啦!Springmvc处理上传文件很简单,我们需要在java目录下创建一个uploadController.java创建这么一个控制器,在上面加上@Controller注解。在Controller中编写以下代码:

     @PostMapping("onfile")
     @ResponseBody
     public String onfile(MultipartFile file) throws IOException {
         File file1 =new File("F:/fileupload/"+file.getOriginalFilename());//创建file对象
         if(!file1.exists())
                file1.createNewFile();//在磁盘创建该文件
         file.transferTo(file1);//将接受的文件存储
         return "sucucess";
     }
    

    其中:

    • @PostMapping(“onfile”) 的意思为该请求方式为post,且请求的url在项目中的相对地址为onfile
    • @ResponseBody指不返回web页面,而是返回字符串或json字符串,在这里我们直接用一个成功单词代表跳转后的界面。
    • public String onfile(MultipartFile file) 函数名不重复就行,而MultipartFile file就是Springmvc封装的一个处理文件的接口,其中参数名(这里是file)要和前端界面文件名相同(input type=“file”,name="file"中的name),通过这个接口你可以更容易的对文件进行各种操作,而本案例就是将上传的文件保存到本地F盘。

    对于函数中的几行核心代码各司其职,除了注释的解释外,大致的流程可以参考如下图:
    在这里插入图片描述

    运行测试

    这样启动项目,在浏览器输入http://localhost:8080/index1.html,选择文件上传,点击上传之后就可以在本地看到上传的文件啦。
    在这里插入图片描述
    至此,单文件上传就完成啦,单文件上传前端需要注意的就是form表单的method类型以及 enctype参数,而服务端也只需要用MultipartFile 接口就可以很容易的对文件进行接受。

    多文件上传

    上面讲的是单文件上传,很多时候你可能遇到的需求不光光是单文件上传。就比如你一定熟悉这个页面:
    在这里插入图片描述

    如上你可以看到,这么一次文件上传不止一个图片,并且数量也不确定,但都属于同一名称和集合的内容。这就是多文件上传。对于这种情况无论在前端还是服务端也是很容易处理的。

    前端设计

    我们这里实现一个多张图片的上传,首先在static目录下创建一个index2.html的页面。里面的具体内容为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>多文件上传</title>
    </head>
    <body>
    <h2>同一类别多个文件上传</h2>
    <form name="onfile"  action="onfiles2" method="post" enctype="multipart/form-data">
        图片:
        <input type="file" name="img"><br>
        <input type="file" name="img"><br>
        <input type="file" name="img"><br>
        <input type="file" name="img"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    这样前端页面就编写完成,其中action要改为onfiles2,也就是待会要在服务端编写的接口。还有注意的这些input 所有type为file代指类型为文件,而name均为img意思是上传一组名称为img图片的集合。

    服务端设计

    而在我们服务端,其实用MultipartFile[]数组就可以对这样的多文件进行接收,我们在controller中编写以下代码:

    @PostMapping("onfiles2")
    @ResponseBody
    public String onfiles2(MultipartFile img[]) throws IOException {
       for(int i=0;i<img.length;i++)
       {
           if(!img[i].isEmpty())//文件不空
           {
               File imgfile =new File("F:/fileupload/"+img[i].getOriginalFilename());
               imgfile.createNewFile();
               img[i].transferTo(imgfile);
               logger.info(img[i].getOriginalFilename());
           }
       }
        return "sucucess";
    }
    

    这个处理方式和前面的很相似,只不过是需要遍历MultipartFile[]对每个文件进行接收处理,当然文件为空的时候不进行处理。

    运行测试

    这样打开浏览器输入:http://localhost:8080/index2.html,上传文件测试效果:
    在这里插入图片描述

    这样一组类似相册上传的功能就完成啦,当然实际开发中的文件上传的要求肯定比这个要求严格很多,可能对文件的格式、大小都有一定的要求,这就要求你在前端和服务端都要对文件的后缀名、大小等信息进行校验,以达到自己场景化的需求。

    文件下载

    文件下载估计你在日常生活中会经常遇到,而你下载的其实就是服务端(服务器)的资源,对于文件类型有多种多样的,浏览器也能够识别很多种资源,事实上你现在访问的这个网页也是服务端的html文件、图片文件等资源,只不过这些资源浏览器能够显示而不会保存到本地。

    直接访问资源VS下载资源

    如果直接访问的资源是浏览器所不能识别解析的,例如doc、zip等类型文件,那访问的时候会默认下载到本地。而当你在Springmvc中使用下载功能时,无论是什么资源都以下载的形式返回给客户端。这种区别可以参考下图:
    在这里插入图片描述

    在文件下载方面的实现,servlet本身也是实现文件下载的,不过使用起来有点繁琐。其原理就是往HttpServletResponse response的输出流写字节内容。而我们Springmvc对文件下载也做了封装,将下载功能封装至ResponseEntity类中,我们在使用的时候也很方便。下面就来实战文件下载的功能。

    首先,我们在F盘建立download文件夹,在里面添加对应文件,这个文件夹我们作为服务端的资源。
    在这里插入图片描述

    前端设计

    我们在创建一个文件下载的前端页面,在static目录下创建index3.html,页面的具体内容为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Springmvc文件下载</title>
    </head>
    <body>
    <h2>Springmvc文件下载</h2>
    个人照片<a href="/download/个人照片.png">个人照片.png</a><br>
    个人简历<a href="/download/个人简历.pdf">个人简历.pdf</a>
    </body>
    </html>
    

    其中href是下载的超链接,download是下载的接口名,而链接最后面部分则是下载资源名称。

    服务端设计

    文件下载的原理就是服务端向客户端返回二进制流和信息,而Springmvc通过ResponseEntity完成。我们在controller中编写以下接口实现下载的功能:

    @GetMapping("download/{filename}")
    public ResponseEntity<byte[]>download(@PathVariable String filename) throws IOException {
        //下载文件的路径(这里绝对路径)
        String filepath= "F:/download/"+filename;
        File file =new File(filepath);
        //创建字节输入流,这里不实用Buffer类
        InputStream in = new FileInputStream(file);
        //available:获取输入流所读取的文件的最大字节数
        byte[] body = new byte[in.available()];
        //把字节读取到数组中
        in.read(body);
        //设置请求头
        MultiValueMap<String, String> headers = new HttpHeaders();
        headers.add("Content-Disposition", "attchement;filename=" + file.getName());
        //设置响应状态
        HttpStatus statusCode = HttpStatus.OK;
        in.close();
        ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
        return entity;//返回
    }
    

    这样就是实现了文件下载功能,如果用传统servlet的方式下载文件可能需要在HttpServletResponse response中设置各种信息,而使用Springmvc的ResponseEntity只需要将文件二进制主体、头信息以及状态码设置好即可进行文件下载,在易用性和简洁上更胜一筹。

    运行测试

    打开浏览器输入:http://localhost:8080/index3.html;点击需要下载的文件,就实现了文件下载的功能,运行情况图如下:
    在这里插入图片描述

    此时你就遇到了一个文件下载非常常见的问题:中文文件名错误显示。这个解决方案也很容易解决,只需将Content-Disposition内容后面的文件名进行url编码即可,具体代码为(替换上面对于部分):

    headers.add("Content-Disposition", "attchement;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
    

    这样重启程序,刷新页面再次点击下载的链接,你就会发现文件被成功的下载了:
    在这里插入图片描述

    总结与拓展

    至此,Springmvc的单文件上传、多文件上传以及文件下载你已经全部掌握了,是不是满满的成就感想去实现一个自己的小网站并把相关内容放进去?不过Springmvc文件上传下载虽然简单,但你依然需要掌握其原理,学好java中的io文件传输,这样在各种场景的文件传输任务中方能胜任。

    总结

    前面所讲文件上传,前端就是form表单用<input type="file">表示客户端要上传文件,而服务端主要使用MultipartFile或者MultipartFile[]分别接收单个文件和多个文件。而在存储到本地也仅仅需要在本地磁盘创建对应文件然后MultipartFile调用transferTo()方法即可将上传的文件储存。

    而文件下载的前端需要一个请求的url链接,服务端需要编写这个链接对应的接口。通过一些名称找到文件在本地真实的位置通过ResponseEntity即可将二进制文件返回给客户达到文件下载的功能。而ResponseEntity使用也很简单在创建时候只需要传入二进制主体、头和状态码即可成功返回,而这些Springmvc已进行了很好封装你可以直接使用。

    而无论是文件上传、多文件上传还是文件下载,一个完整的案例大致都需要这样一个过程:

    • 构思需求和页面大体样式
    • 编写前端html页面
    • 编写服务端响应的请求
    • 启动程序运行测试

    在其中过程如果有问题可以根据编译器的错误提示、运行时的错误日志找到根源进行修正,这样完整的案例就可以成功完成啦!

    案例拓展

    你是否觉得自己掌握的可以了?那好,咱们拓展提升一下,我给你来一个需求:单文件和多文件混合上传

    假设小明需要实现一个文件上传功能,小明需要上传一份简历和若干份照片(小于3)。这个项目该如何设计呢?它的计划页面可能是这样的:

    在这里插入图片描述

    我觉得聪明的你一定不会被难住,对于前端界面的html有什么想法呢?

    对于种类来说有简历和照片两种文件,对于它们各自来说,简历只有一份,而照片可能有多份。

    那么咱们的html页面可以这样设计:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>个人信息上传</title>
    </head>
    <body>
    <h2>个人信息上传</h2>
    <form name="onfile"  action="infoupload" method="post" enctype="multipart/form-data">
        姓名:<input type="text" name="name" ><br>
        年龄:<input type="text" name="age"> <br>
        图片:<input type="file" name="img">
             <input type="file" name="img">
        简历:<input type="file" name="resume"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    
    

    这里面和前面的单文件上传不同的是有多个input标签,此外action也要改成infoupload意思是你需要写这么一个接口来处理这个文件上传的内容。在controller中编写以下代码:

     private  static Logger logger= LoggerFactory.getLogger(uploadController.class);
        @PostMapping("infoupload")
        @ResponseBody
        public String onfile(String name,String age, MultipartFile img[],MultipartFile resume) throws IOException {
            logger.info(name);//日志中打印传输的name
            logger.info(age);
            //接收img[]
            for(int i=0;i<img.length;i++)
            {
                if(!img[i].isEmpty())//文件不空
                {
                    File imgfile =new File("F:/fileupload/"+img[i].getOriginalFilename());
                    imgfile.createNewFile();
                    img[i].transferTo(imgfile);
                }
            }
             //接收resume
            File resumefile =new File("F:/fileupload/"+resume.getOriginalFilename());
            //在磁盘中创建文件,此时文件存在但没有内容
            resumefile.createNewFile();
            //将接受的文件复制到创建的文件中
            resume.transferTo(resumefile);
            return "sucucess";
        }
    
    

    这个理解起来其实也很容易,这个和上面主要的区别就是函数中的多参数,其实每一个参数都是要和前端页面的form表单input标签的内容对应(名称一致)。form表单中的file类型在Springmvc的controller中就是对应MultipartFile类型,form表单中的text类型对应controller中的String类型。如果上传单个文件,在服务端就用MultipartFile类型参数接收,如果多文件就用MultipartFile[]进行接收。上传类型和个数根据你自己的需求设计定义。

    我们启动程序打开浏览器输入http://localhost:8080/index4.html选择文件进行上传,然后在本地你可以看到文件成功被保存。

    在这里插入图片描述

    至此,本篇的内容就结束了,本文主要简单讲解了Springmvc中文件上传、多文件上传、文件下载的实现,现在你已熟练掌握。青山不改,绿水长流,我们下期再见!下课!

    博主微信公众号:bigsai 一个等你关注而朝思夜暮的程序猿。
    在这里插入图片描述

    展开全文
  • SpringMVC文件上传下载的实现,包括UploadController和DownloadController
  • springmvc文件上传下载乱码 一、设置文件解析器 <!-- 多媒体文件解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- ...

    springmvc文件上传下载乱码

    一、设置文件解析器

    <!-- 多媒体文件解析器 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 最大允许上传大小5MB -->
         <property name="maxUploadSize" value="5242880" />
         <property name="maxInMemorySize" value="4096" />
         <property name="defaultEncoding" value="UTF-8"></property>
        </bean>
    

    二、web.xml中设置过滤器

    配置过滤器(配置characterEncodingFilter类中的encoding(设置request),forceEncoding(设置response))

      <filter>
        <!--过滤器名和所属类名-->
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <!--request编码-->
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
    
        <init-param>
          <!--response编码-->
          <param-name>focreEncoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
      </filter>
        <!--过滤器映射名,过滤类型-->
      <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    三、前端jsp中form表单设置enctype=“multipart/form-data”

    <form action="user/fileUpload" method="post" enctype="multipart/form-data">  
        <input type="file" name="files" />  
        <input type="submit" value="上传" />  
    </form>
    
    展开全文
  • 最近朋友问我springMVC实现文件上传下载,在这里我就简单的解释一下,以下是实现的步骤。 一、文件上传 1. 2.依赖jar的坐标 <dependency> <groupId>commons-fileupload</groupId> <...
  • 主要介绍了springMVC配置环境实现文件上传下载的相关资料,需要的朋友可以参考下
  • springmvc文件上传下载实现起来非常简单,此springmvc上传下载案例适合已经搭建好的ssm框架(spring+springmvc+mybatis)使用,ssm框架项目的搭建我相信你们已经搭建好了,这里不再赘述,下面就开始吧! ssm框架...
  • 1:springmvc上传文件的前提 使用springmvc上传文件时一定得注意xml配置,在我们的srpingmvc.xml中加上以下代码即可 配置文件解析器对象,要求id名称必须是multipartResolver <bean id="multipartResolver" ...
  • 主要介绍了IE8+SpringMVC文件上传防止JSON下载的相关资料,需要的朋友可以参考下
  • springmvc实现文件上传jar包

    千次下载 热门讨论 2015-04-03 00:41:42
    springmvc中实现文件上传所要用到的jar包
  • 一、文件上传 springmvc.xml <!-- 配置 MultipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <propert...
  • SpringMVC批量上传

    2018-04-19 18:25:17
    java 基于springMVC多图片上传,MySQL源码 @Controller @RequestMapping("/upload") public class UploadFileController { @Autowired private UploadFileService uploadFileService; @RequestMapping("/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,934
精华内容 19,573
关键字:

springmvc文件上传下载

spring 订阅