Spring Boot 实现文件上传
Maven依赖
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>
上传到本地
package yang.controller;import java.util.UUID;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@RestController
@RequestMapping("/upload")
public class UploadController {@PostMappingpublic void upload(@RequestPart MultipartFile file) throws IOException {// 获取文件名String fileName = file.getOriginalFilename();// 获取文件扩展名String extName = fileName.substring(fileName.lastIndexOf("."));// 获取项目根目录String root = System.getProperty("user.dir");// 获取文件存放目录String fileDir = "/src/main/java/yang/upload/";// 如果目标目录不存在就创建File dir = new File(root + fileDir);if (!dir.exists()) {dir.mkdirs();}// 生成不重复的文件名称String uuidName = UUID.randomUUID().toString() + extName;// 文件上传的位置String uploadDir = root + fileDir + uuidName;// 上传文件file.transferTo(new File(uploadDir));}
}
上传到OSS
package yang.controller;import java.util.UUID;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import yang.pojo.Result;import java.io.InputStream;@RestController
@RequestMapping("/upload")
public class UploadController {@PostMappingpublic Result upload(@RequestPart MultipartFile file) throws IOException {// Endpoint(地域节点)String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 秘钥String accessKeyId = "LTAI5tNVbvdh8BGmnK3GNa4i";String accessKeySecret = "JXN5Mc3e40QlOxGBBUVJjAsw2TNCR2";// Bucket名称String bucketName = "qweqweqweqweqw12312cds";// 文件名称String fileName = file.getOriginalFilename();// 创建一个不重复的文件名称String uuidName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 文件输入流InputStream inputStream = file.getInputStream();// 将文件上传到OSSossClient.putObject(bucketName, uuidName, inputStream);// 文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + uuidName;return Result.success(url);} catch (OSSException oe) {System.out.println("捕获了 OSSException, 这意味着您的请求已发送到 OSS, 但由于某种原因被拒绝并显示错误响应");return Result.error(oe.getMessage());} catch (ClientException ce) {System.out.println("捕获 ClientException, 表示客户端在尝试与 OSS 通信时遇到, 严重的内部问题, 例如无法访问网络。");return Result.error(ce.getMessage());} finally {if (ossClient != null) {// 最后记得关闭ossClientossClient.shutdown();}}}
}
封装工具类
上面的代码我们可以定义一个工具类,这样在任何需要文件上传的地方只需要调用 upload
方法即可,大大减少了代码量
package yang.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;@Component
public class AliOSSUtils {private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";private String accessKeyId = "LTAI5tNVbvdh8BGmnK3GNa4i";private String accessKeySecret = "JXN5Mc3e40QlOxGBBUVJjAsw2TNCR2";private String bucketName = "qweqweqweqweqw12312cds";public String upload(MultipartFile file) throws IOException {InputStream inputStream = file.getInputStream();String fileName = file.getOriginalFilename();String uuidName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, uuidName, inputStream);String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + uuidName;ossClient.shutdown();return url;}
}
使用工具类
@PostMapping
public Result upload(@RequestPart MultipartFile file) throws IOException {AliOSSUtils oss = new AliOSSUtils();String url = oss.upload(file);return Result.success(url);
}