简介
文件上传,是指将本地的图片,视频,音频等文件上传到服务器,提供其他用户浏览或者下载的过程。
文件上传
前端页面三要素
- 前端要想上传文件必须要定义一个form表单
- 表单项:file,这样在前端点击这个按钮时就会弹出上传文件对话框
- 表单的提交方式必须得是post方式,上传文件可能会比较大所以使用post提交方式
- 我们需要将enctype属性设置编码格式为:“multipart/form-data”,如果设置enctype属性,则只是提交文件名
<form action="/upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
头像:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
服务端接收
- 此时可以上传文件
- 默认位置是在C盘,以临时文件的形式存储
- 可以使用断点方式查看,放行之后,该临时文件将被删除,并不会保存
@Slf4j
@RestController
@RequestMapping("/upload")
public class commonController {
@PostMapping()
public Result<String> uploadFile(String username, Integer age, MultipartFile file){
log.info("文件上传:{},{},{}",username,age,file);
return Result.success();
}
}
注意:要想接收到文件,表单项file name=“file”,必须和服务端 MultipartFile file ,名字一致都是file
- 如果名字不一致,需要使用@RequestParam注解绑定参数
本地存储
在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。一般很少用本地存储方式,该存储方式,在前端页面中是无法直接访问的,而且服务器的磁盘空间有限
@Slf4j
@RestController
@RequestMapping("/upload")
public class commonController {
@PostMapping()
public Result<String> uploadFile(String username, Integer age, MultipartFile file) throws IOException {
log.info("文件上传:{},{},{}",username,age,file);
//获取原始文件名
String filename = file.getOriginalFilename();
//构造唯一文件名
//获取最后一个.的索引
int index = filename.lastIndexOf(".");
//得到文件扩展名
String extname=filename.substring(index);
String newFileName= UUID.randomUUID().toString()+extname;
//将接收到的文件存储在本地
file.transferTo(new File("C:\\Users\\SuperJohn\\Desktop\\upload\\"+newFileName));
return Result.success();
}
}
设置上传文件大小
默认上传文件大小为1MB,超出将报错,此时我们需要修改文件上传的大小
在properties文件中指定上传文件大小,根据配置文件的格式不同编写格式也不同
#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
阿里云OSS
前端请求文件上传,使用阿里云OSS对象存储服务,此时就不需要将文件存储在本地服务器了,直接将文件上传到OSS
准备工作
开通阿里云OSS,参照对应的手册,在官网就可以做
- 注册阿里云
- 开通对象存储服务
- 创建bucket
- 获取AccesKey
- 参照官方sdk编写入门程序
引入阿里云OSS相关依赖
导入maven坐标
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
- 如果是java9以上的版本,则还需要添加jaxb相关依赖,代码如下:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
引入阿里云OSS上传文件的工具类
package com.coda.updatefile.common;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
public class AliOSSUtils {
private String endpoint = "oss-cn-beijing.aliyuncs.com";
private String accessKeyId = "LTAI5t8SLkc824n2zc1EtnCx";
private String accessKeySecret = "bDtlIqNvy3yl7uWrJQgcwmq0yBRPrR";
private String bucketName = "sky-take-out-coda";
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
图片上传接口
@Slf4j
@RestController
@RequestMapping("/upload")
public class commonController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping()
public Result<String> uploadFile(String username, Integer age, MultipartFile file) throws IOException {
log.info("文件上传:{},{},{}",username,age,file);
//调用阿里云OSS工具类
String url = aliOSSUtils.upload(file);
log.info("上传成功后的url:{}",url);
return Result.success();
}
}