🌈键盘敲烂,年薪30万🌈
目录
前言:
文件上传在后端开发中经常用到,例如显示一张图片,就需要我们后端保存图片文件,然后将图片文件回显给浏览器。
- 对于图片文件来说就俩个步骤:
接收上传的图片保存起来 ->本地 或 云服务器
回显图片给浏览器 -> 返回本地文件路径 或 云服务器的文件路径
- 服务器处理图片的两种方式:
①保存在服务器本地的磁盘中
②交给云服务器存储,例如阿里云OSS
- 注意:
每次请求时,服务器会将文件临时保存在一个地方,请求结束时,临时文件会被删除,所以才要把上传的文件下载到本地或云端。
- 认识MultipartFile类:
spring框架封装好了用于前后端传输文件的类 -> MultipartFile,前端页面必须有一个type为MultipartFile的From表单,当前端发送请求到后端时,我们后端只需用一个MultipartFile类的对象就可以接收这个文件参数。下面就说一下两种文件存储方式。
一、本地存储:
①文件上传到本地:
注意:
保存的路径可以在配置文件里设置
保存的文件名要用UUID生成,防止文件覆盖
java
//保存到本地
@PostMapping("/upload")
public R<String> upload(MultipartFile file) throws Exception {
//要保存的路径
String basePath = "D:\\image";
//file是一个临时文件,当请求结束时,临时文件会删除
// 先判断转存路径的文件夹有没有
File dir = new File(basePath);
if(!dir.exists()){
dir.mkdirs();
}
//这里有两个地方要改
//1.文件路径要写在配置文件里面
//2.文件名要用UUID生成
// 获取源文件名 xxxx.jpg
String originalFilename = file.getOriginalFilename();
// 获取后缀 .jpg
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 使用UUID重新生成文件名
String fileName = UUID.randomUUID().toString() + suffix;
file.transferTo(new File(basePath + fileName));
return R.success(fileName);
}
②文件下载到浏览器:
注意:
用输出流从服务器本地向浏览器输出数据
java
//文件下载到浏览器
@GetMapping("/download")
public void download(String name, HttpServletResponse response) throws IOException {
//从服务器读取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basePath + name));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1204];
while( (len = bis.read(bytes)) != -1 ){
bos.write(bytes, 0, len);
bos.flush();
}
bos.close();
bis.close();
}
二、云存储(阿里云OSS):
①文件上传到阿里云:
注意:
需要导入阿里OSS的相关包,使用putObject方法以流的方式写道云服务器。
java
public String upload(MultipartFile file) throws IOException, ClientException {
String endpoint = propertiesUtils.getEndpoint();
String bucketName = propertiesUtils.getBucketName();
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider=CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
②将阿里云的图片路径返回给数据库:
存储到阿里云中的图片直接赋值路径从浏览器就能打开,所以直接在数据库中创建一个字段存储图片的url即可回显图片。
📕总结
- 本地存储不安全,数据一旦丢失,维护成本高。通过transerForTo方法转存到本地服务器。
- 云存储通过阿里OSS工具类提供的putObject方法,将文件保存到阿里云OSS服务器。