文件上传功能在网页中见的太多了,比如上传照片作为头像、上传Excel文档导入数据等

先写个上传文件的html

<!DOCTYPE html>
<html>
<head>
<title>Spring MVC文件上传与下载</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="upload" method="POST" enctype="multipart/form-data"> <!-- 上传文件注意enctype -->
文件描述:<input type="text" name="desc" /> <br><br>
选择文件:<input type="file" name="file" /> <br><br>
<input type="submit" value="上传" />
</form>
</body>
</html>

写个controller接收上传的文件

package net.sonng.mvcdemo.controller;

import java.io.File;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; @Controller
public class UploadController {
@RequestMapping("/upload")
public String upload(HttpServletRequest request,@RequestParam("desc") String desc,@RequestParam("file") MultipartFile file) throws Exception{
//接收到的文件绑定到MultipartFile对象中
System.out.println(desc);
if (!file.isEmpty()){ //如果文件不为空,那么将它存起来
String path=request.getServletContext().getRealPath("/images"); //接收的文件放在/images目录下,并获得文件系统目录
String filename=file.getOriginalFilename();//获取文件名
File filepath=new File(path,filename); //根据文件所在目录和文件名创建File对象
if(!filepath.getParentFile().exists()){ //如果所在目录不存在,那么创建
filepath.getParentFile().mkdirs();
}
file.transferTo(new File(path+File.separator+filename)); //调用transferTo()方法将文件存储到目标位置
//file.transferTo(filepath) //也可以用这条语句
return "result";
}else{
return "error";
}
}
}

关于multipartFile

常用方法有:

  • String getContentType(): 获取文件的MIME类型
  • String getOriginalFilename(): 获取文件名
  • long getSize(): 获取文件大小,单位KB
  • boolean isEmpty(): 文件是否为空
  • void transferTo(File dest): 将文件存储到dest
  • String getName(): 获取表单的参数名
  • byte[] getBytes(): 获取文件数据
  • InputStream getInputStream(): 获取文件流

Spring MVC的文件上传组件需要MultipartResolver接口,依赖于Apache Commons FileUpload技术实现了一个实现类CommonsMultipartResolver,因此还需要两方面的工作:1. 引入Apache Commons FileUpload包;2. 配置xml

引入Apache Commons FileUpload及其依赖的Commons IO

配置xml

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize"> <!-- 还可以限制上传文件的大小 -->
<value>10485760</value>
</property>
<property name="defaultEncoding" > <!-- 注意这个编码格式,要跟上传的页面的编码一致 -->
<value>UTF-8</value>
</property>
</bean>

部署访问,检查Tomcat的该app目录下的/images目录下是否有上传的文件。

将上传的文件以对象属性的形式保存

比如头像,总是属于某个用户,因此在用户类中可以定义一个MultipartFile属性存储用户头像

上传用户头像的html

<!DOCTYPE html>
<html>
<head>
<title>Spring MVC文件上传与下载</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="upload" method="POST" enctype="multipart/form-data">
用户名:<input type="text" name="username" /> <br><br>
选择图片:<input type="file" name="avatar" /> <br><br>
<input type="submit" value="上传" />
</form>
</body>
</html>

实体类user:

package net.sonng.mvcdemo.entity;

import org.springframework.web.multipart.MultipartFile;

public class User {
private String username;
private MultipartFile avatar; //上传的头像作为User的一个属性
//。。。。。
}

写controller:

package net.sonng.mvcdemo.controller;

import java.io.File;

import javax.servlet.http.HttpServletRequest;

import net.sonng.mvcdemo.entity.User;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; @Controller
public class UploadController {
@RequestMapping("/upload")
public String upload(HttpServletRequest request,@ModelAttribute User user,Model model) throws Exception{
if (!user.getAvatar().isEmpty()){
String path=request.getServletContext().getRealPath("/avatars/");
String filename=user.getAvatar().getOriginalFilename();
File filepath=new File(path,filename);
if(!filepath.getParentFile().exists()){
filepath.getParentFile().mkdirs();
}
user.getAvatar().transferTo(new File(path+File.separator+filename));
model.addAttribute("user", user);
return "result";
}else{
return "error";
}
}
@RequestMapping("/download") //上传了之后再下载
public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam("filename") String filename,Model model)throws Exception{
String path=request.getServletContext().getRealPath("/avatars/"); //获取文件所在路径
filename=new String(filename.getBytes("ISO-8859-1"),"UTF-8"); //不知何故,result.jsp的请求参数是ISO-8859-1编码的,但明明设置了charset=utf-8
File file=new File(path+File.separator+filename);
HttpHeaders headers=new HttpHeaders();
String downloadFileName=new String(filename.getBytes("UTF-8"),"ISO-8859-1"); //少了这句,可能导致下载中文文件名的文档,只有后缀名的情况
headers.setContentDispositionFormData("attachment", downloadFileName);//告知浏览器以下载方式打开
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//设置MIME类型
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);//
//用FileUpload组件的FileUtils读取文件,并构建成ResponseEntity<byte[]>返回给浏览器
//HttpStatus.CREATED是HTTP的状态码201
}
}

上传成功后,返回页面result.jsp,

<%@page pageEncoding="utf-8"
contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>文件的上传与下载</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<p>下载刚才上传的文件</p>
<a href="download?filename=${user.avatar.originalFilename }">下载文件</a>
</body>
</html>

部署测试,分别测试中文/英文文件名

总结

上传文件:上传的文件绑定到MultipartFile中;获取文件名;要存储的文件系统路径;创建目录;用MultipartFile的transferTo()存储

下载文件:获取要下载的文件名,注意编码;在HttpHeaders中设置以下载方式打开,设置MIME类型;用FileUtils.readFileToByteArray()读取文件数据;用ResponseEntity<byte[]>构建返回对象

0062 Spring MVC的文件上传与下载--MultipartFile--ResponseEntity的更多相关文章

  1. Java Web 学习(8) —— Spring MVC 之文件上传与下载

    Spring MVC 之文件上传与下载 上传文件 表单: <form action="upload" enctype="multipart/form-data&qu ...

  2. Spring MVC的文件上传和下载

    简介: Spring MVC为文件上传提供了直接的支持,这种支持使用即插即用的MultipartResolver实现的.Spring MVC 使用Apache Commons FileUpload技术 ...

  3. Spring MVC-学习笔记(5)spring MVC的文件上传、下载、拦截器

    1.文件上传.      spring MVC为文件上传提供了直接的支持,这种支持是即插即用的MultipartResolver(多部分解析器)实现的.spring MVC使用Apache Commo ...

  4. 使用Spring MVC实现文件上传与下载

    前段时间做毕业设计的时候,想要完成一个上传文件的功能,后来,虽然在自己本地搭建了一个ftp服务器,然后使用公司的工具完成了一个文档管理系统:但是还是没有找到自己想要的文件上传与下载的方式. 今天看到一 ...

  5. 基于Spring MVC的文件上传和下载功能的实现

    配置文件中配置扫描包,以便创建各个类的bean对象 <context:component-scan base-package="com.neuedu.spring_mvc"& ...

  6. Spring MVC实现文件上传

    基础准备: Spring MVC为文件上传提供了直接支持,这种支持来自于MultipartResolver.Spring使用Jakarta Commons FileUpload技术实现了一个Multi ...

  7. Spring MVC的文件上传

    1.文件上传 文件上传是项目开发中常用的功能.为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户 ...

  8. 【Spring学习笔记-MVC-13】Spring MVC之文件上传

    作者:ssslinppp       1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Co ...

  9. spring mvc ajaxfileupload文件上传返回json下载问题

    问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...

随机推荐

  1. TCP第三次握手失败怎么办

    笔试题中经常会遇到这个问题:如果tcp建立连接时第三次握手失败,tcp会做何操作?该问题的本质是判断我们对tcp的状态转换是否能有比较深刻的理解.只要理解了下面的状态转换图,很容易回答上述问题. 在此 ...

  2. viewport Meta Tag

    网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放. <meta name="viewport" conten ...

  3. ARM指令集—SWP指令

    ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...

  4. 设置pycharm为Eclipse快捷键

    Ctrl + O 根据name模糊查找当前文件中类.方法Alt + (向左箭头或者向右箭头) ,回退or前进到到之前查看或者编辑处Alt + (向上箭头或者向下箭头) ,将当前方法整体往下或者往上移动 ...

  5. luigi框架--关于python运行spark程序

    首先,目标是写个python脚本,跑spark程序来统计hdfs中的一些数据.参考了别人的代码,故用了luigi框架. 至于luigi的原理 底层的一些东西Google就好.本文主要就是聚焦快速使用, ...

  6. 飘逸的python - 不使用keyword,求和1+2+…+n

    依据题意,我们不能用到if/else/for/while等keyword. --------------思考中------------ 思路: 1.用递归实现循环 2.递归的终止条件不用if怎么推断呢 ...

  7. 踩坑记:mysql timeStamp默认值0000-00-00 00:00:00 报错

    报错现象: 从mysql5.5数据库导出的数据结构放到mysql5.7.10 报错create_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00 ...

  8. java 和 C# 响应输出的相似度

    java servlet response: bf.append("Shipment No, STT No, WIN Event, DateTime, WOU Envent, DateTim ...

  9. Linux操作系统中多线程的同步

    1 互斥锁 互斥锁用来保证一段时间内只有一个线程在执行一段代码.必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的. 先看下面一段代码.这是一个读/写程序,它们公用一个 ...

  10. 【apache】apache模拟高并发请求

    目的:测试程序的性能 运用的工具是apache的ab工具,装有apache服务器的一般都有ab工具. lamp命令: ab -c 10 -n 100 "http://a.ilanni.com ...