package com.fcb.car.omssvc.api.controller.v1;
import com.evergrande.cloud.web.dto.ResponseDto;
import com.evergrande.cloud.web.dto.Results;
import com.evergrande.cloud.web.web.BaseWebController;
import com.fcb.car.omssvc.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
/**
* @author radish.zhou
* @version 1.0
*/
@RestController
@RequestMapping("/oms/v1/upload")
public class UploadController extends BaseWebController {
@Autowired
private UploadService uploadervice;
/**
* 文件上传 /type 0公有 1 私有
* @param uploadFile
* @return
*/
@PostMapping("/uploadFile")
public Mono<ResponseDto<Object>> upload(@RequestPart("file") FilePart uploadFile,@RequestParam("type") int type) {
return Results.successObj(uploadervice.upload(uploadFile, type));
}
/**
* 获取文件下载url前缀
* @param
* @return
*/
@GetMapping(path = {"/getPrefix"})
public Mono<ResponseDto<Object>> getPrefix() {
return Results.successObj(uploadervice.getPrefix());
}
@GetMapping("/getOssUrl")
public Mono<ResponseDto<Object>> getOssUrl(@RequestParam("fileKeys") String fileKeys, @RequestParam(name = "expiration", defaultValue = "1000", required = false) int expiration) {
logger.info("进入 获取oss url方法, fileKeys:{}, expiration:{}", fileKeys, expiration);
return Results.successObj(uploadService.getOssUrl(fileKeys, expiration));
}
}
package com.fcb.car.omssvc.service;
import com.fcb.car.omssvc.api.dto.OssInfoDto;
import org.springframework.http.codec.multipart.FilePart;
/**
* <p>
* 服务类
* </p>
*
* @author xangqun
* @since 2020-03-25
*/
public interface UploadService {
String upload(FilePart uploadFile,int type);
OssInfoDto getPrefix();
/**
* 获取oss url
*
* @param keys
* @param expiration
* @return
*/
String getOssUrl(String keys,int expiration);
}
package com.fcb.car.omssvc.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.ObjectMetadata;
import com.evergrande.cloud.base.id.IdGen;
import com.fcb.car.omssvc.api.dto.OssInfoDto;
import com.fcb.car.omssvc.service.UploadService;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Files;
import java.nio.file.Path;
/**
* <p>
* 服务实现类
*
* </p>
*
* @author xangqun
* @since 2020-03-25
*/
@Slf4j
@Service
@RefreshScope
public class UploadServiceImpl implements UploadService {
@Value("${aliyun.oss.pub.endpoint}")
private String endpoint;
@Resource(name = "pubOssBucketName")
private String pubOssBucketName;
@Resource(name = "priOssBucketName")
private String priOssBucketName;
@Resource(name = "pubOssClient")
private OSS pubOssClient;
@Resource(name = "priOssClient")
private OSS priOssClient;
@Value("${aliyun.oss.pri.bucketName}")
private String priBucketName;
@Override
@Transactional(rollbackFor = Exception.class)
public String upload(FilePart filePart, int type) {
String filePath = "";
try {
Path path = Files.createTempFile("test", filePart.filename());
String fileType = Files.probeContentType(path);
filePart.transferTo(path);
//获得file对象
File file = new File(path.toString());
String fileName = file.getName();
ByteArrayOutputStream bos;
try (FileInputStream fis = new FileInputStream(file)) {
bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len = -1;
while ((len = fis.read(b)) != -1) {
bos.write(b, 0, len);
}
}
byte[] array = bos.toByteArray();
// MultipartFile uploadFile = new MockMultipartFile("file", fileName, "jpg", array);
MultipartFile uploadFile = new MockMultipartFile("file", fileName, fileType, array);
String filename = uploadFile.getOriginalFilename();
filePath = getFilePath(filename);
// 创建Metadata
ObjectMetadata metadata = new ObjectMetadata();
String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(uploadFile.getBytes()));
metadata.setContentMD5(md5);
metadata.setContentType("text/plain");
metadata.setContentDisposition("attachment;filename=\"" + filename + "\"");
if (type == 0) {//上传公有
pubOssClient.putObject(pubOssBucketName, filePath, new ByteArrayInputStream(uploadFile.getBytes()), metadata);
} else {//上传私有
priOssClient.putObject(priOssBucketName, filePath, new ByteArrayInputStream(uploadFile.getBytes()), metadata);
}
} catch (Exception e) {
log.error("upload error:", e);
return null;
}
return filePath;
}
@Override
public OssInfoDto getPrefix() {
OssInfoDto ossInfoDto = new OssInfoDto();
ossInfoDto.setEndpoint(endpoint);
ossInfoDto.setBucketName(priBucketName);
return ossInfoDto;
}
private String getFilePath(String filename) {
DateTime dateTime = new DateTime();
return "car/" + dateTime.toString("yyyy")
+ "/" + dateTime.toString("MM") + "/"
+ dateTime.toString("dd") + "/" + IdGen.uuid();
}
private String getExcelPath(String filename) {
DateTime dateTime = new DateTime();
return "hdb/upload/" + dateTime.toString("yyyyMMddHHmmssSS") + filename;
}
@Override
public String getOssUrl(String keys, int expiration) {
Date expirations = new Date(System.currentTimeMillis() + 3600L * expiration);
DefaultCredentials defaultCredentials = new DefaultCredentials(accessKeyId, accessKeySecret);
CredentialsProvider provider = new DefaultCredentialProvider(defaultCredentials);
OSSClient ossClient = new OSSClient(ossConfig.getEndpoint(), provider, null);
URL url = ossClient.generatePresignedUrl(bucketName, keys, expirations);
return url.toString();
}
}
package com.fcb.car.omssvc.api.dto;
import lombok.Data;
/**
* @author liangqiuhua
* @version 2.0
*/
@Data
public class OssInfoDto {
private static final long serialVersionUID = 450333485671147827L;
private String endpoint;
private String bucketName;
}
aliyun:
oss:
pub:
endpoint: https://oss-cn-XX.aliyuncs.com
bucketDomain: oss-cn-XX.aliyuncs.com
outerBucketDomain: oss-cn-XX.aliyuncs.com
bucketName: devsit-XX-XX-XX-pub
accessKeyId: XXXXXXXXXXX
accessKeySecret: A6XXXXXXXXXXXRfXXzhXX
pri:
endpoint: https://oss-cn-shenzhen.aliyuncs.com
bucketDomain: oss-cn-shenzhen.aliyuncs.com
outerBucketDomain: oss-cn-shenzhen.aliyuncs.com
bucketName: devsit-XX-pt-XX-pri
accessKeyId: LTXXXXXXXXrcvznLXXX
accessKeySecret: jXXXXXXXXYvTXXXXnkXXXX
sts:
pub:
endpoint: sts.cn-shenzhen.aliyuncs.com
bucketName: devsit-XX-pt-sale-pub
bucketDomain: oss-cn-shenzhen.aliyuncs.com
outerBucketDomain: oss-cn-shenzhen.aliyuncs.com
accessKeyId: XXXXXXXXXXXXX
accessKeySecret: XXXXXXXXXXXXXXXXXXXX
roleArn: acs:ram::1580XXXX674X:role/XXXX
roleSessionName: devsit-XX-pt-sale-pri
pri:
endpoint: sts.cn-shenzhen.aliyuncs.com
bucketName: devsit-car-pt-sale-pri
bucketDomain: oss-cn-shenzhen.aliyuncs.com
outerBucketDomain: oss-cn-shenzhen.aliyuncs.com
accessKeyId: XXXXXXXXXXXXXXXXXX
accessKeySecret: XXXXXXXXXXXXXXXXXXXX
roleArn: acs:ram::158078XXXXXXXX336XX:role/XXXX
roleSessionName: devsit-XX-pt-sale-pri
pom.xml
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>