文章目录
- 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发
- 文件上传功能剖析
- 进行书写一个小的文件上传
- 文件上传的文件三要素
- 首先表单提交的方式要是 post方式,
- 第二个enctype="multipart/form-data 这个要求
- 第三个是在提交文件的type要选择 type="file"的方式
- 云存储 ,进行云存储保存改造
- 项目整合云服务存储
- AliOssUtils的书写
- 首先进行数据的存储地址分析
这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发
文件上传功能剖析
首先分析业务场景,文件上传功能场景,一般是修改员工信息,或者新增用户要上传的文件信息,
这里文件上传
这是场景分析
进行书写一个小的文件上传
先写一个html文件
在springboot项目中,在resource中,书写一个html页面
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--enctype="multipart/form-data"-->
<form method="post" enctype="multipart/form-data" action="/upload">
姓名:<input type="text" name="username">
<br>
年龄:<input type="text" name="age">
<br>
文件:<input type="file" name="image">
<br>
<input type="submit" value="提 交">
</form>
</body>
</html>
这是一个表单页面代码,下面要介绍一下文件上传的前端三要素
文件上传的文件三要素
首先表单提交的方式要是 post方式,
第二个enctype="multipart/form-data 这个要求
第三个是在提交文件的type要选择 type="file"的方式
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--enctype="multipart/form-data"-->
<form method="post" enctype="multipart/form-data" action="/upload">
姓名:<input type="text" name="username">
<br>
年龄:<input type="text" name="age">
<br>
文件:<input type="file" name="image">
<br>
<input type="submit" value="提 交">
</form>
</body>
</html>
这个是前端文件的全部代码,可以直接使用
前端
那么书写完前端后,就可以书写后端
package com.healer.controller;
import com.healer.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/**
* @author healer
* @Description UploadController
* @data 2024-06-01 9:35
*/
@RestController
@Slf4j
public class UploadController {
@PostMapping("/upload")
public Result uploadFile(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传.....{} {}", username, age);
// 首先获取源文件
String originalFilename = image.getOriginalFilename();
// 使用UUID生成新文件名
String uuid = UUID.randomUUID().toString();
// 截取
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFile = uuid + substring;
image.transferTo(new File("D:\\images\\" + newFile));
return Result.success();
}
}
这个是后端的代码
在上传文件的时候会需要进行,文件名防止重复
所以这里使用UUID去生成前面的文件名
然后再获取文件名的拓展名
然后使用uuid生成的id 与拓展名进行拼接
那么就获取新的文件名
上传文件
然后就文件上传成功了
本地存储完成
没有什么业务逻辑
直接在controller层接收数据 然后保存就可以了
云存储 ,进行云存储保存改造
项目都会搭建文件存储服务,或者是使用云服务去存储文件
先进行下载依赖
然后找代码程序
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = "exampledir/exampleobject.txt";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
String filePath= "D:\\localpath\\examplefile.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
InputStream inputStream = new FileInputStream(filePath);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
只需要再上面修改你的oss信息就可以使用
进行测试
测试通过就可以使用
项目整合云服务存储
项目整合阿里云oss,第一步需要进行改造为工具类
首先分析,在上传文件,上传成功之后需要返回图片的url地址
所以返回值是string类型
然后要分析图片的地址
进行封装
https://tailsdemo01.oss-cn-beijing.aliyuncs.com/1.png
首先第一部分是 https://
然后是 bucketName
然后是.oss-cn-beijing.aliyuncs.com
然后是 /
然后是文件的名字
使用工具类进行封装
那么上传文件肯定是上传一个 multitypeFile类型
MultipartFile image
@PostMapping("/upload")
public Result uploadFile(MultipartFile image) throws Exception {
String upload = aliOssUtil.upload(image);
return Result.success(upload);
}
返回的data就可以存储在数据库中,那么用户可以直接通过iamge的标签进行查询到数据内容
AliOssUtils的书写
首先这个工具类是基于实例代码进行改写
package com.healer.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
/**
* @author healer
* @Description AliOssUtil
* @data 2024-06-01 15:23
*/
@Component
public class AliOssUtil {
String endpoint = "";
String accessKeyId = "";
String accessKeySecret = "";
String bucketName = "";
public String upload(MultipartFile multipartFile) throws Exception {
String originalFilename = multipartFile.getOriginalFilename();
String objectName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
InputStream inputStream = multipartFile.getInputStream();
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
// String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// https://tailsdemo01.oss-cn-beijing.aliyuncs.com/1.png
return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;
}
}
那么就几个点
首先第一个点
这个方法需要返回值
首先进行数据的存储地址分析
https://tailsdemo01.oss-cn-beijing.aliyuncs.com/1.png
首先第一部分是 https://
然后是 bucketName
然后是.oss-cn-beijing.aliyuncs.com
然后是 /
然后是文件的名字
使用工具类进行封装
//这个是获得文件原始名字
String originalFilename = multipartFile.getOriginalFilename();
然后进行改造
String objectName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
新名字
使用UUID进行生成前缀,可以确保没有重复
然后再使用文件的后缀
之后就获得新名字,然后上传阿里云
文件的内容是将这个文件先转为inputStream
multipartFile.getInputStream();
文件的传输都是multipartFile 类型
所以可以一步拿到 inputStream流
然后就直接塞到方法里面
工具类更改完毕,可以直接用了
可以将这个工具类交给springIOC容器
让spring去管理
我们直接拿到工具类的代理对象就可以
那么在controller中
@PostMapping("/upload")
public Result uploadFile(MultipartFile image) throws Exception {
String upload = aliOssUtil.upload(image);
return Result.success(upload);
}
至此,功能完毕,完结