package com.qxueyou.scc.teach.res.service.impl;
|
|
//import com.example.study.springboot.background.service.HweiYunOBSService;
|
//import com.example.study.springboot.config.HweiOBSConfig;
|
import com.obs.services.ObsClient;
|
import com.obs.services.exception.ObsException;
|
import com.obs.services.model.*;
|
import com.qxueyou.scc.base.model.FileMeta;
|
import com.qxueyou.scc.base.model.Result;
|
import com.qxueyou.scc.base.util.CollectionUtils;
|
import com.qxueyou.scc.base.util.QFileUtils;
|
import com.qxueyou.scc.base.util.UUIDUtils;
|
import com.qxueyou.scc.config.HweiOBSConfig;
|
import com.qxueyou.scc.teach.res.model.ResFile;
|
import com.qxueyou.scc.teach.res.service.HweiYunOBSService;
|
import com.qxueyou.scc.teach.res.service.IFileService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.catalina.core.ApplicationPart;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.*;
|
|
/**
|
* @ClassName: HweiYunOBSServiceImpl
|
* @Description: 华为云OBS服务业务层
|
* @Author: wuhuiju
|
* @Date: 2021-12-21 17:05
|
* @Version: 1.0
|
*/
|
@Slf4j
|
@Service
|
public class HweiYunOBSServiceImpl implements HweiYunOBSService {
|
|
private final Logger log = LogManager.getLogger(HweiYunOBSServiceImpl.class);
|
@Autowired
|
private HweiOBSConfig hweiOBSConfig;
|
|
@Autowired
|
FileService fileService;
|
|
public final static String FILE_TYPE_VIDEO = "video";
|
|
public final static String FILE_TYPE_DOC = "doc";
|
|
public final static String FILE_TYPE_AUDIO = "audio";
|
|
public final static String FILE_TYPE_DATA = "data";
|
|
public final static String FILE_TYPE_IMG = "img";
|
|
private static final Map<String, String> fileFormatMap = CollectionUtils.newStringMap("MPEG", FILE_TYPE_VIDEO,
|
"AVI", FILE_TYPE_VIDEO, "MOV", FILE_TYPE_VIDEO, "ASF", FILE_TYPE_VIDEO, "WMV", FILE_TYPE_VIDEO, "NAVI",
|
FILE_TYPE_VIDEO, "3GP", FILE_TYPE_VIDEO, "RAM", FILE_TYPE_VIDEO, "RA", FILE_TYPE_VIDEO, "MKV",
|
FILE_TYPE_VIDEO, "F4V", FILE_TYPE_VIDEO, "RMVB", FILE_TYPE_VIDEO, "MP4", FILE_TYPE_VIDEO,
|
|
"DOC", FILE_TYPE_DOC, "DOCX", FILE_TYPE_DOC, "PDF", FILE_TYPE_DOC, "PPT", FILE_TYPE_DOC, "PPTX",
|
FILE_TYPE_DOC, "XLS", FILE_TYPE_DOC, "XLSX", FILE_TYPE_DOC,
|
|
"MP3", FILE_TYPE_AUDIO, "WMA", FILE_TYPE_AUDIO, "WAV", FILE_TYPE_AUDIO,
|
|
"DATA", FILE_TYPE_DATA,
|
|
"JPG", FILE_TYPE_IMG,"JPEG", FILE_TYPE_IMG, "GIF", FILE_TYPE_IMG, "BMP", FILE_TYPE_IMG, "PNG", FILE_TYPE_IMG
|
|
);
|
|
@Override
|
public boolean delete(String objectKey) {
|
ObsClient obsClient = null;
|
try {
|
// 创建ObsClient实例
|
obsClient = hweiOBSConfig.getInstance();
|
// obs删除
|
obsClient.deleteObject(hweiOBSConfig.getBucketName(),objectKey);
|
} catch (ObsException e) {
|
log.error("obs删除保存失败", e);
|
} finally {
|
hweiOBSConfig.destroy(obsClient);
|
}
|
return true;
|
}
|
|
@Override
|
public boolean delete(List<String> objectKeys) {
|
ObsClient obsClient = null;
|
try {
|
obsClient = hweiOBSConfig.getInstance();
|
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(hweiOBSConfig.getBucketName());
|
objectKeys.forEach(x -> deleteObjectsRequest.addKeyAndVersion(x));
|
// 批量删除请求
|
obsClient.deleteObjects(deleteObjectsRequest);
|
return true;
|
} catch (ObsException e) {
|
log.error("obs删除保存失败", e);
|
} finally {
|
hweiOBSConfig.destroy(obsClient);
|
}
|
return false;
|
}
|
|
|
@Override
|
public List<FileMeta> fileUpload(MultipartFile uploadFile, String objectKey) {
|
ObsClient obsClient = null;
|
List<FileMeta> files = new ArrayList<FileMeta>(2);
|
FileMeta fileMeta = null;
|
try {
|
String destPath = getDestPath(objectKey);
|
String bucketName = hweiOBSConfig.getBucketName();
|
obsClient = hweiOBSConfig.getInstance();
|
|
// 判断桶是否存在
|
boolean exists = obsClient.headBucket(bucketName);
|
|
if(!exists){
|
// 若不存在,则创建桶
|
HeaderResponse response = obsClient.createBucket(bucketName);
|
log.info("创建桶成功" + response.getRequestId());
|
}
|
InputStream inputStream = uploadFile.getInputStream();
|
long available = inputStream.available();
|
PutObjectRequest request = new PutObjectRequest(bucketName,destPath,inputStream);
|
ObjectMetadata objectMetadata = new ObjectMetadata();
|
objectMetadata.setContentLength(available);
|
request.setMetadata(objectMetadata);
|
// 设置对象访问权限为公共读
|
request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
|
PutObjectResult result = obsClient.putObject(request);
|
fileMeta = new FileMeta();
|
ResFile file = fileService.insertFileToDBTwo(objectKey, uploadFile.getSize(), result.getObjectUrl(), uploadFile.getContentType());
|
// SetObjectMetadataRequest ObjectMetadataRequest = new SetObjectMetadataRequest(bucketName, destPath);
|
// ObjectMetadataRequest.setContentDisposition("inline");
|
// obsClient.setObjectMetadata(ObjectMetadataRequest);
|
|
fileMeta.setFileId(file.getFileId());
|
fileMeta.setPath(result.getObjectUrl());
|
fileMeta.setFileSize(uploadFile.getSize() / 1024 + "kb");
|
fileMeta.setFileType(uploadFile.getContentType());
|
fileMeta.setFileName(objectKey);
|
files.add(fileMeta);
|
// 读取该已上传对象的URL
|
log.info("已上传对象的URL" + result.getObjectUrl());
|
return files;
|
// return result.getObjectUrl();
|
} catch (ObsException e) {
|
log.error("obs上传失败", e);
|
} catch (IOException e) {
|
log.error("上传失败", e);
|
} finally {
|
hweiOBSConfig.destroy(obsClient);
|
}
|
return null;
|
}
|
|
private String getDestPath(String name) {
|
String fileType = getFileType(name);
|
|
StringBuffer path = new StringBuffer(128);
|
// path.append(fileType);
|
|
Calendar now = new GregorianCalendar();
|
|
// path.append('/');
|
// path.append(now.get(Calendar.YEAR));
|
// path.append(StringUtils.leftPad(String.valueOf(now.get(Calendar.MONTH)), 2, '0'));
|
// path.append('/');
|
// path.append(now.get(Calendar.DAY_OF_MONTH));
|
// path.append('/');
|
path.append(UUIDUtils.UUID());
|
path.append('.');
|
path.append(QFileUtils.getFileFormat(name));
|
|
return path.toString();
|
|
}
|
private String getFileType(String name) {
|
String fileType = fileFormatMap.get(QFileUtils.getFileFormat(name));
|
return StringUtils.isEmpty(fileType) ? FILE_TYPE_DATA : fileType;
|
}
|
|
@Override
|
public InputStream fileDownload(String objectKey) {
|
ObsClient obsClient = null;
|
try {
|
String bucketName = hweiOBSConfig.getBucketName();
|
obsClient = hweiOBSConfig.getInstance();
|
ObsObject obsObject = obsClient.getObject(bucketName, objectKey);
|
return obsObject.getObjectContent();
|
} catch (ObsException e) {
|
log.error("obs文件下载失败", e);
|
} finally {
|
hweiOBSConfig.destroy(obsClient);
|
}
|
return null;
|
}
|
}
|