Controller
@PostMapping("/uploadUpgradeFile")
public CommonResponse uploadUpgradeFile(MultipartFile file,HttpServletRequest request){
CommonResponse instance = CommonResponse.getInstance();
String companyId = HttpUtil.getCompanyId(request);
try {
String fileUrl = deviceService.uploadUpgradeFile(companyId,file);
instance.setResultData(fileUrl);
}catch (BusinessException businessException){
instance.setErrorCode(businessException.getCode());
instance.setErrorMessage(businessException.getMessage());
}catch (IOException ioException){
instance.setErrorCode(10000);
instance.setErrorMessage(ioException.getMessage());
}
return instance;
}
自定义异常
package cn.iovnet.commons.exception;
import cn.iovnet.commons.utils.util.MessagesUtil;
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 1L;
private Integer code;
private String message;
public BusinessException(Integer code, String message) {
this.code = code;
this.message = message;
}
public BusinessException(Integer code) {
super(MessagesUtil.getMessage(code));
this.code = code;
}
public BusinessException(Integer code, String... args) {
super(MessagesUtil.getMessage(code, args));
this.code = code;
}
public BusinessException(Throwable cause) {
super(cause);
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
public BusinessException(Integer code, Throwable cause) {
super(MessagesUtil.getMessage(code), cause);
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
ServiceImpl
后缀
@Override
public String uploadUpgradeFile(String companyId, MultipartFile file) throws IOException {
String filename = file.getOriginalFilename();
String substring = filename.substring(filename.indexOf(".") + 1);
String fileUrl;
if (substring.equals("txt")){
fileUrl = DdyScheduleConstants.FILE_PATH + companyId + "/" + filename;
} else {
throw new BusinessException(1,"文件类型不匹配");
}
return fileUrl;
}
判断大小不超过30MB
@Override
public String uploadUpgradeFile(String companyId, MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
String fileUrl;
double k = file.getSize()/1024.0/1024.0;
if (k <= 30){
String fileUrl1 = DdyScheduleConstants.FILE_PATH + companyId + "/" + fileName;
fileUrl = AliossUtil.upload(fileUrl1, file.getInputStream());
} else {
throw new BusinessException(1,"文件类型不匹配");
}
return fileUrl;
}
调用的upload方法
public static String upload(String fileUrl, InputStream input) {
OSS ossClient = initOssClient();
try {
PutObjectResult result = ossClient.putObject(new PutObjectRequest(OssConstants.bucketName, fileUrl, input));
ossClient.shutdown();
if (null != result) {
logger.info("upload success. oss url: {}", fileUrl);
return fileUrl;
}
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}
public static String upload(String fileUrl, File file) {
OSS ossClient = initOssClient();
PutObjectResult result = ossClient.putObject(new PutObjectRequest(OssConstants.bucketName, fileUrl, file));
ossClient.shutdown();
if (null != result) {
logger.info("upload success. oss url: {}", fileUrl);
return fileUrl;
}
return "";
}
常量路径
public static final String FILE_PATH = "/xxx/yyy-file/";
Alioss工具类
public class AliossUtil {
private static final Logger logger = LoggerFactory.getLogger(AliossUtil.class);
private static final Map<String, AppendUpload> APPEND_UPLOAD_CACHE_MAP = new ConcurrentHashMap<>();
private AliossUtil() {
}
public static String copy(String source, String target) {
OSS ossClient = initOssClient();
CopyObjectResult result = ossClient.copyObject(OssConstants.bucketName, source, OssConstants.bucketName, target);
ossClient.shutdown();
if (null != result) {
logger.info("copy success. oss url: {}", target);
return target;
}
return "";
}
public static boolean multipartUpload(String fileUrl, MultipartFile file) {
boolean result = false;
OSS ossClient = initOssClient();
try {
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(OssConstants.bucketName, fileUrl);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(file.getContentType());
request.setObjectMetadata(metadata);
InitiateMultipartUploadResult upResult = ossClient.initiateMultipartUpload(request);
String uploadId = upResult.getUploadId();
List<PartETag> partETags = new ArrayList<PartETag>();
final long partSize = 1 * 1024 * 1024L;
long fileLength = file.getSize();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
InputStream input = file.getInputStream();
input.skip(startPos);
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(OssConstants.bucketName);
uploadPartRequest.setKey(fileUrl);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(input);
uploadPartRequest.setPartSize(curPartSize);
uploadPartRequest.setPartNumber( i + 1);
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
partETags.add(uploadPartResult.getPartETag());
}
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(OssConstants.bucketName, fileUrl, uploadId, partETags);
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
logger.info(completeMultipartUploadResult.getETag());
result = true;
} catch (Exception e) {
logger.error("文件上传失败 {}", e);
} finally {
ossClient.shutdown();
}
return result;
}
public static String upload(String fileUrl, InputStream input) {
OSS ossClient = initOssClient();
try {
PutObjectResult result = ossClient.putObject(new PutObjectRequest(OssConstants.bucketName, fileUrl, input));
ossClient.shutdown();
if (null != result) {
logger.info("upload success. oss url: {}", fileUrl);
return fileUrl;
}
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}
public static String upload(String fileUrl, File file) {
OSS ossClient = initOssClient();
PutObjectResult result = ossClient.putObject(new PutObjectRequest(OssConstants.bucketName, fileUrl, file));
ossClient.shutdown();
if (null != result) {
logger.info("upload success. oss url: {}", fileUrl);
return fileUrl;
}
return "";
}
public static String appendUpload(String fileUrl, InputStream input, Boolean isEnd) {
if (!APPEND_UPLOAD_CACHE_MAP.containsKey(fileUrl)) {
OSS ossClient = new OSSClientBuilder().build(OssConstants.endpoint, OssConstants.keyId, OssConstants.keySecret);
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(OssConstants.bucketName, fileUrl, input);
appendObjectRequest.setPosition(0L);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
AppendUpload appendUpload = new AppendUpload();
appendUpload.setOssClient(ossClient);
appendUpload.setAppendObjectRequest(appendObjectRequest);
appendUpload.setAppendObjectResult(appendObjectResult);
APPEND_UPLOAD_CACHE_MAP.put(fileUrl, appendUpload);
} else {
AppendUpload appendUpload = APPEND_UPLOAD_CACHE_MAP.get(fileUrl);
OSS ossClient = appendUpload.getOssClient();
AppendObjectResult appendObjectResult = appendUpload.getAppendObjectResult();
AppendObjectRequest appendObjectRequest = appendUpload.getAppendObjectRequest();
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(input);
appendObjectResult = ossClient.appendObject(appendObjectRequest);
appendUpload.setAppendObjectResult(appendObjectResult);
}
if (isEnd) {
AppendUpload appendUpload = APPEND_UPLOAD_CACHE_MAP.get(fileUrl);
OSS ossClient = appendUpload.getOssClient();
ossClient.shutdown();
APPEND_UPLOAD_CACHE_MAP.remove(fileUrl);
}
return fileUrl;
}
private static OSS initOssClient() {
OSS ossClient = new OSSClientBuilder().build(OssConstants.endpoint, OssConstants.keyId, OssConstants.keySecret);
ossClient.setBucketAcl(OssConstants.bucketName, CannedAccessControlList.PublicRead);
if (!ossClient.doesBucketExist(OssConstants.bucketName)) {
ossClient.createBucket(OssConstants.bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(OssConstants.bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
return ossClient;
}
public static List<String> downloadFile(String objectName) {
List<String> list = new ArrayList<>();
OSS ossClient = new OSSClientBuilder().build(OssConstants.endpoint, OssConstants.keyId, OssConstants.keySecret);
try {
OSSObject ossObject = ossClient.getObject(OssConstants.bucketName, objectName);
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
list.add(line);
}
reader.close();
} catch (OSSException e) {
logger.error("下载文件失败,{},{}", e.getErrorCode(), e.getErrorMessage());
} catch (IOException e) {
logger.error("下载文件失败,{}", e.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return list;
}
public static ResponseEntity<byte[]> downloadFileToStream(String objectName) {
InputStream inputStream = null;
OSS ossClient = new OSSClientBuilder().build(OssConstants.endpoint, OssConstants.keyId, OssConstants.keySecret);
try {
OSSObject ossObject = ossClient.getObject(OssConstants.bucketName, objectName);
inputStream = ossObject.getObjectContent();
HttpHeaders headers = new HttpHeaders();
String downloadFileName = objectName.substring(objectName.lastIndexOf("/") + 1);
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.add("Access-Control-Expose-Headers", "filename");
headers.add("filename", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
assert inputStream != null;
byte[] bytes = inputStream.readAllBytes();
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} catch (OSSException e) {
logger.error("下载文件失败,{},{}", e.getErrorCode(), e.getErrorMessage());
} catch (IOException e) {
logger.error("下载文件失败,{}", e.getMessage());
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ossClient != null) {
ossClient.shutdown();
}
}
return null;
}
public static ResponseEntity<byte[]> downloadFileToZip(List<String> objectNameList, String saveFileName) {
OSS ossClient = new OSSClientBuilder().build(OssConstants.endpoint, OssConstants.keyId, OssConstants.keySecret);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(byteArrayOutputStream);
try {
for (String objectName : objectNameList) {
String fileName = objectName.substring(objectName.lastIndexOf("/") + 1);
OSSObject ossObject = ossClient.getObject(OssConstants.bucketName, objectName);
InputStream inputStream = ossObject.getObjectContent();
ZipEntry zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
zipOut.write(inputStream.readAllBytes());
zipOut.closeEntry();
}
HttpHeaders headers = new HttpHeaders();
String fileName = new String(saveFileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);
headers.setContentDispositionFormData("attachment", fileName);
headers.add("Access-Control-Expose-Headers", "filename");
headers.add("filename", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
byte[] bytes = byteArrayOutputStream.toByteArray();
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
zipOut.close();
} catch (IOException e) {
e.printStackTrace();
}
if (ossClient != null) {
ossClient.shutdown();
}
}
return null;
}
}
文件上传例子
@PostMapping("/upload")
public CommonResponse upload(@RequestBody MultipartFile file)throws Exception{
CommonResponse instance = CommonResponse.getInstance();
String fileUrl = goodDeedsService.upload(file);
instance.setResultData(fileUrl);
return instance;
}
@Override
public String upload(MultipartFile file) throws IOException {
String uploadUrl = null;
String originalFilename = file.getOriginalFilename();
if (StringUtils.isNotBlank(originalFilename)) {
String fileName = UUID.randomUUID().toString().replace("-", "") + System.currentTimeMillis() + SecurityConstants.RANDOM_ORIGIN_SEPARATOR + originalFilename;
uploadUrl = AliossUtil.upload(SecurityConstants.GOOD_DEEDS_URL + fileName, file.getInputStream());
}
return uploadUrl;
}