目录
一、准备
1.工具
- 代码工具:IntelliJ IDEA 2020.2.2
- 环境:apache-maven-3.2.2
- 容器:apache-tomcat-8.5.63
- jdk:jdk1.8.0_261
2.新建一个maven项目
具体可以参考上一篇ssm+layui的前半部分
3.pom.xml文件导包
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
4.在springMVC.xml里面进行配置
可以在配置里面设置上传文件大小以及格式
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件的尺寸,以kb为单位 -->
<property name="maxUploadSize">
<value>10240</value>
</property>
<property name="defaultEncoding" value="utf-8"></property>
</bean>
要记住是以kb为单位,自己可以事先计算一下大概要上传多大的文件
5.新建一个jsp页面,取名file.jsp
名字也可以自己随便取,不影响运行
二、文件的上传
1.在新建的jsp页面加入一个文件上传的表单
<form action="fileUpload.do" method="post" enctype="multipart/form-data">
<input type="file" name="multipartFile">
<input type="submit" value="上传">
</form>
2.在后台新建一个java文件,取名随意发挥
/**
* 上传文件
* @param multipartFile
* @return 路径
*/
@RequestMapping(value = "/fileUpload.do", method = RequestMethod.POST)
public String fileUpload(@RequestParam MultipartFile multipartFile){
//a.png,获取原始名字
String oldName = multipartFile.getOriginalFilename();
//可以先不写下面的代码,通过这两行代码在控制台查看一下自己上传文件的名字
//检测一下代码运行是否正常
System.out.println("名字:"+oldName);
//通过分割得到结尾后缀 .png
String endName = oldName.substring(oldName.lastIndexOf("."));
System.out.println(endName);
//产生随机数名字
UUID uuid = UUID.randomUUID();
//新的名字 = 随机数 + 后缀
String newName = uuid+endName;
System.out.println(newName);
//上传的文件对象复制到本地,自己随便挑选文件夹即可
String a = "D:\\浏览器下载\\";
//D:\浏览器下载\7-9作业.txt
File file = new File(a+multipartFile.getOriginalFilename());
try {
//把File对象名字放进来
multipartFile.transferTo(file);
} catch (Exception e) {
e.printStackTrace();
}
//运行成功后,返回本页面
return "file";
}
这里有一个非常重要的地方,表单里面input框的name是multipartFile ,我们后台fileUpload()方法里面的 MultipartFile 对象名也一定是multipartFile ,可以和我写的name不一样,但两者name一定要一致,不然页面运行会报错
这时候就可以进行单个文件的上传了,自己可以测试一下是否上传成功
3.多种命名方式
- 随机数命名
//产生随机数名字 UUID uuid = UUID.randomUUID(); //新的名字 = 随机数 + 后缀 String newName = uuid+endName; System.out.println(newName);
- 时间戳命名
//生成时间戳 String name = new SimpleDateFormat("yyyyMMddHHmmss").format(); //新的名字 = 随机数 + 后缀 String newName = name+endName; System.out.println(newName);
- 自己拼接名字
//自己拼接名字 String name = "新名字"+endName; System.out.println(name);
-
等等多种方式
4.多个文件上传
单个文件的上传已经可以实现了,那么多个文件上传要怎么操作呢?
多个文件的上传有带你类似于多个数据提交,这时候我们可以用到数据来进行接收
5.jsp页面多添加一些input标签
记住name属性和后台保持一致
<form action="fileUpload.do" method="post" enctype="multipart/form-data">
<input type="file" name="multipartFile">
<input type="file" name="multipartFile">
<input type="file" name="multipartFile">
<input type="submit" value="上传">
</form>
6.实现多个文件循环上传
这时候就要把接收单个参数的方法变成用数组接收,即把fileUpload(@RequestParam MultipartFile multipartFile)改为fileUpload(@RequestParam MultipartFile multipartFile[ ])
/**
* 上传文件
* @param multipartFile
* @return 路径
*/
@RequestMapping(value = "/fileUpload.do", method = RequestMethod.POST)
public String fileUpload(@RequestParam MultipartFile multipartFile[]){
//上传的文件对象复制到本地
String a = "D:\\浏览器下载\\";
try {
//通过循环添加多个数据
for (MultipartFile s:multipartFile){
File file = new File(a+s.getOriginalFilename());
s.transferTo(file);
}
} catch (Exception e) {
e.printStackTrace();
}
return "file";
}
三、文件的下载
1.jsp添加一个下载的标签,如<a></a>等
<!-- 路径 后台接收的变量名 文件名称,全名称-->
<a href="downLoad.do?fileName=5470c5f2-df88-4435-af8d-1c14a5fa9df2.txt">下载文件</a>
2.后台写文件下载的方法
/**
* 下载文件
* 1.根据文件名找到硬盘中的文件
* 2.读取硬盘上的文件 读取
* 3.响应给客户端 写出来
* @param fileName
* @param response
* @return null
*/
@RequestMapping(value = "/downLoad.do")
public String downLoad(String fileName, HttpServletResponse response){
String filePath = "D:\\浏览器下载\\"+fileName;
File file = new File(filePath);
//设置响应回去的编码格式
response.setCharacterEncoding("utf-8");
//响应回去的格式
response.setContentType("multipart/form-data");
//响应头:attachment 以附件的形式响应回去
response.setHeader("Content-Disposition","attachment;fileName="+fileName);
//读取硬盘的文件对象
try {
//运用io流
InputStream input = new FileInputStream(file);
byte[] bytes = new byte[(int)file.length()];
//读取文件
input.read(bytes);
//得到输出流,响应给客户端
response.getOutputStream().write(bytes);
//关流
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
因为我用的<a>标签传输的数据,所以默认是用的GET方法,如果有用POST提交的要记得在@RequestMapping 的属性里用post截取
四、在别人电脑下载与上传
1.问题
- 两者必须连接同一个wifi
- 局限性太大,娱乐一下还是可以的,不适合大文件的下载与传输
2.连接方法
在保证两者连接同一wifi后,在浏览器地址栏输入对方地址即可
把localhost改为对方电脑的IP地址,8080是tomcat端口,后面接上对方创建的file.jsp路径,即对方的文件下载与上传的jsp页面,这样就可以将自己电脑的文件上传给对方了,下载同理