OssFileController:
@Api(tags = {"OSS对象存储文件 管理"})
@RestController
@RequestMapping("/oss")
public class OssFileController {
@Resource
private OssFileService fileUploadService;
@ApiOperation(value = "文件上传", httpMethod = "POST")
@PostMapping(value = "/upload")
public String upload(@RequestParam("file") @NotNull(message = "上传文件不能为空") MultipartFile file) throws Exception {
return fileUploadService.upload(file);
}
}
interface:
public interface OssFileService {
String upload(MultipartFile multipartFile) throws Exception;
}
service :
@Service
public class OssFileServiceImpl implements OssFileService {
@Override
public String upload(MultipartFile multipartFile) throws Exception {
String fileAllName = multipartFile.getOriginalFilename();
String fileType = fileAllName.substring(fileAllName.lastIndexOf(".") + 1);
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String filePath = uuid + "." + fileType;
String url = OssUtils.endpoint.replaceFirst("http://", "http://" + OssUtils.privateBucket + ".") + "/" + filePath;
String contentType = OssUtils.getContentType(fileAllName);
//保存本地
File file = XmlUtil.ossUpload(multipartFile);
try {
//上传oss
OssUtils.ossUpload(filePath, file, contentType);
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传失败");
}
//删除本地文件
XmlUtil.deleteFile(file);
return url;
}
}
工具类:
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
public class XmlUtil {
public static void deleteFile(File... files) {
for (File file : files) {
//logger.info("File:[{}]",file.getAbsolutePath());
if (file.exists()) {
file.delete();
}
}
}
public static File ossUpload(MultipartFile file) throws IOException {
// 获取文件名
String fileName = file.getOriginalFilename();
// 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// 用uuid作为文件名,防止生成的临时文件重复
File excelFile = File.createTempFile(UUID.randomUUID().toString(), prefix);
if (excelFile.exists()){
excelFile.delete();
}
// MultipartFile to File
file.transferTo(excelFile);
//程序结束时,删除临时文件
return excelFile;
}
}
工具类:
public class OssUtils {
// 创建存储空间,Endpoint以杭州为例,其它Region请按实际情况填写。
public static String endpoint = "http://oss-cn-shanghai.aliyuncs.com";
public static String accessId = "****";
public static String accessKey = "****";
public static String privateBucket = "***";
public static void main(String[] args) {
setBucketAcl();
}
/**
* 列举所有的存储空间
*/
public static void getBucketList() {
// Endpoint以杭州为例,其它Region请按实际情况填写。
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
// 列举存储空间。
List<Bucket> buckets = ossClient.listBuckets();
for (Bucket bucket : buckets) {
System.out.println(" - " + bucket.getName());
}
// 关闭OSSClient。
ossClient.shutdown();
}
public static void getBucketAcl() {
// Endpoint以杭州为例,其它Region请按实际情况填写。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
// 获取存储空间的访问权限。
AccessControlList acl = ossClient.getBucketAcl(privateBucket);
System.out.println(acl.toString());
// 关闭OSSClient。
ossClient.shutdown();
}
public static void setBucketAcl() {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
// 设置存储空间的访问权限为私有。
ossClient.setBucketAcl(privateBucket, CannedAccessControlList.PublicRead);
ossClient.shutdown();
}
public static void ossUpload(String fileName, File file, String contentType) {
try {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType(contentType);
UploadFileRequest uploadFileRequest = new UploadFileRequest(privateBucket, fileName);
// 指定上传的本地文件。
uploadFileRequest.setUploadFile(file.toString());
// 指定上传并发线程数,默认为1。
uploadFileRequest.setTaskNum(5);
// 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
uploadFileRequest.setPartSize(1 * 1024 * 1024);
// 开启断点续传,默认关闭。
uploadFileRequest.setEnableCheckpoint(true);
uploadFileRequest.setCheckpointFile("uploadFile.ucp");
// 文件的元数据。
uploadFileRequest.setObjectMetadata(meta);
// 设置上传成功回调,参数为Callback类型。
//uploadFileRequest.setCallback("<yourCallbackEvent>");
// 断点续传上传。
ossClient.uploadFile(uploadFileRequest);
// 关闭OSSClient。
ossClient.shutdown();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
/**
* 通过文件名判断并获取OSS服务文件上传时文件的contentType
*/
public static String getContentType(String fileName) {
String fileExtension = fileName.substring(fileName.lastIndexOf("."));
if (".bmp".equalsIgnoreCase(fileExtension)) {
return "image/bmp";
}
if (".gif".equalsIgnoreCase(fileExtension)) {
return "image/gif";
}
if (".jpeg".equalsIgnoreCase(fileExtension)) {
return "image/jpeg";
}
if (".jpg".equalsIgnoreCase(fileExtension)) {
return "image/jpg";
}
if (".png".equalsIgnoreCase(fileExtension)) {
return "image/png";
}
if (".html".equalsIgnoreCase(fileExtension)) {
return "text/html";
}
if (".txt".equalsIgnoreCase(fileExtension)) {
return "text/plain";
}
if (".vsd".equalsIgnoreCase(fileExtension)) {
return "application/vnd.visio";
}
if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
return "application/vnd.ms-powerpoint";
}
if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
return "application/msword";
}
if (".xml".equalsIgnoreCase(fileExtension)) {
return "text/xml";
}
if (".mp4".equalsIgnoreCase(fileExtension)) {
return "video/mp4";
}
if (".mp3".equalsIgnoreCase(fileExtension)) {
return "audio/mp3";
}
return "text/html";
}
}
注意:文件上传过大,设置限制
spring:
servlet:
multipart:
max-file-size: 20MB
max-request-size: 100MB
multipart/form-data 接收参数:
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) httpServletRequest;
Map<String, OssFileVo> result = new LinkedHashMap<>();
MultiValueMap<String, MultipartFile> multiFileMap = multipartRequest.getMultiFileMap();
Iterator<Map.Entry<String, List<MultipartFile>>> iterator1 = multiFileMap.entrySet().iterator();