文件上传是指将本地文件、图片、视频、音频等文件上传到服务器,供其他用户浏览和下载的过程,后端接收参数时,参数类型为MultipartFile类型,前端传递表单的enctpye属性为multipart/form-data,上传的文件是临时文件,需要进行处理
1)服务器本地存储
使用MultipartFile类型内部提供的transferTo方法:
/**
* 文件上传
* @param file 上传的文件
*/
@PostMapping("/upload")
public Result fileUpload(MultipartFile file) throws IOException {
// 获取原始文件名
String originalFilename = file.getOriginalFilename();
// 获取文件后缀名---使用字符串中的lastIndexOf获取最后一个点的位置
int lastIndex = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(lastIndex);
// 构建唯一的文件名----使用uuid通用唯一识别码
String stringUUID = UUID.randomUUID().toString();
// 进行文件存储---存储的文件名和上传的文件名相同
file.transferTo(new File("/Users/frank/Pictures/upload"+stringUUID+extname));
return Result.success();
}
注意:springBoot中默认上传文件大小为1mb,上传大文件时,要进行配置:
#配置单个文件的上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传文件大小(一次可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
2)使用云服务存储
-
登陆直接的阿里云账户,创建oss对象存储服务,创建存储集合
-
引入工具类---官方文档
注意:@Value
注解无法直接加到static修饰的变量上,为解决这个问题,我们可以在类上添加@Component
注解,交给ioc容器,然后在类内部提供set方法,在方法上添加对应的@Value
注解
@Component
public class AliOssUtil {
//@Value("${aliyun.oss.endpoint}")
private static String endpoint;
//@Value("${aliyun.oss.accessKeyId}")
private static String accessKeyId;
//@Value("${aliyun.oss.accessKeySecret}")
private static String accessKeySecret;
//@Value("${aliyun.oss.bucketName}")
private static String bucketName;
@Value("${aliyun.oss.endpoint}")
public void setEndpoint(String endpoint) {
AliOssUtil.endpoint = endpoint;
}
@Value("${aliyun.oss.accessKeyId}")
public void setAccessKeyId(String accessKeyId) {
AliOssUtil.accessKeyId = accessKeyId;
}
@Value("${aliyun.oss.bucketName}")
public void setBucketName(String bucketName) {
AliOssUtil.bucketName = bucketName;
}
@Value("${aliyun.oss.accessKeySecret}")
public void setAccessKeySecret(String accessKeySecret) {
AliOssUtil.accessKeySecret = accessKeySecret;
}
//上传文件,返回文件的公网访问地址
public static String uploadFile(String objectName, InputStream inputStream){
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
//公文访问地址
String url = "";
try {
// 创建存储空间。
ossClient.createBucket(bucketName);
ossClient.putObject(bucketName, objectName, inputStream);
url = "https://"+bucketName+"."+endpoint.substring(endpoint.lastIndexOf("/")+1)+"/"+objectName;
} 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();
}
}
return url;
}
}
-
配置工具类中的属性值,在配置文件(.yam文件)中配置具体的值注解进行自动注入
# 阿里云常量配置
aliyun:
oss:
endpoint: http://oss-cn-beijing.aliyuncs.com
bucketName: 填自己的
accessKeyId: 填自己的
accessKeySecret: 填自己的
-
进行接口开发:String中的
lastIndexOf
可以获取字符串中从最后开始的指定字符串的位置
@Slf4j
@RestController
public class FileUploadController {
/**
* 文件上传
* @param file
* @return
* @throws IOException
*/
@PostMapping("/upload")
public Result uploadFile(MultipartFile file) throws IOException {
log.info("文件上传····················");
// 获取文件原始名称
String originalFilename = file.getOriginalFilename();
// 使用UUID进行文件重命名
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传文件,传入文件名和文件流
String url = AliOssUtil.uploadFile(fileName, file.getInputStream());
log.info("文件上传成功············url:{}", url);
return Result.success(url);
}
}