正常的項目中通常會有存放文件的需求,例如用戶頭像,用戶簡歷等,我們需要把它存放在專門存放數據的雲服務器上。
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);
}
}