正常的项目中通常会有存放文件的需求,例如用户头像,用户简历等,我们需要把它存放在专门存放数据的云服务器上。
Spring Boot 项目上传文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
将前端传来的MultipartFile转换(transferTo)成设定好路径名称和文件类别的新文件并保存
package com.example.demo.util;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotNull;
import java.io.File;
import java.io.IOException;
public class TransferFile extends FileUtils {
/**
* MultipartFile转换File
*
* @param file 文件
* @param fileName 文件名
* @param fileSuffix 文件后缀
* @param path 文件存储路径
* @return File
* @throws IOException
*/
public static File transMultipartFile(@NotNull MultipartFile file, String fileName, String fileSuffix, String path) throws IOException {
//创建保存文件的路径
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
//创造一个设定好 fileName(文件名称)、fileSuffix(文件类型)、dir(路径)的文件
File tempFile = File.createTempFile(fileName, fileSuffix, dir);
//将前端传来的文件转换成我们创造的文件
file.transferTo(tempFile);
return tempFile;
}
}
控制器FileUploadController.class
package com.example.demo.controller;
import com.example.demo.component.OSSComponent;
import com.example.demo.util.TransferFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
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;
@RestController
public class FileUploadController {
@Autowired
OSSComponent ossComponent;
@PostMapping("/upload")
public void uploadFile(@RequestParam("file")MultipartFile multipartFile)throws IOException {
File file = TransferFile.transMultipartFile(multipartFile, UUID.randomUUID().toString().replace("-",""),".jpg","D:/ww/file");
}
}
PostMan调用方
结果:
发送给阿里云的oss
连接阿里云服务器并提供发送的帮助类
package com.example.demo.component;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Component
public class OSSComponent {
/**
* 访问域名地址
*/
@Value("${aliyun.oss.endpoint}")
private String endpoint;
/**
* 访问秘钥
*/
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
/**
* 访问秘钥
*/
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
/**
* 用来管理所存储Object的存储空间
*/
@Value("${aliyun.oss.bucketName}")
private String bucketName;
/**
* 访问url
*/
@Value("${aliyun.oss.public.url}")
private String publicUrl;
/**
* 储存路径
*/
@Value("${aliyun.oss.path}")
private String ossPath;
/**
* oss 单个图片文件上传
* @param file
* @return
*/
public String uploadImage(File file, String fileName){
try {
//创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
ossClient.putObject(bucketName,fileName,file);
ossClient.shutdown();
return String.format(publicUrl,bucketName) + fileName;
}catch (Exception e){
throw e;
}
}
/**
* 多个图片文件上传
* @param files
* @return
*/
public List<String> uploadImages(File[] files){
List<String> urls = new ArrayList<>();
try {
//创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
for (File file : files) {
String fileName = ossPath + UUID.randomUUID().toString().replace("-", "");
ossClient.putObject(bucketName, fileName, file);
urls.add(String.format(publicUrl,bucketName) + fileName);
}
ossClient.shutdown();
return urls;
}catch (Exception e){
throw e;
}
}
}
pom.xml文件中新增
<!-- aliyun oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
application.yml
server:
port: 8090
aliyun:
oss:
endpoint: xx
accessKeyId: xx
accessKeySecret: xx
bucketName: xx
public:
url: xx
path: xx
Controller中在保存号本地文件后将文件和文件名上传到OSS中
package com.example.demo.controller;
import com.example.demo.component.OSSComponent;
import com.example.demo.util.TransferFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
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;
@RestController
public class FileUploadController {
@Autowired
OSSComponent ossComponent;
@PostMapping("/upload")
public void uploadFile(@RequestParam("file")MultipartFile multipartFile)throws IOException {
File file = TransferFile.transMultipartFile(multipartFile, "ww",".jpg","D:/ww/file");
String fileName = UUID.randomUUID().toString().replace("-","");
String url = ossComponent.uploadImage(file,fileName);
}
}