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 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 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 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 fileUpload(MultipartFile uploadFile, String objectKey) { ObsClient obsClient = null; List files = new ArrayList(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,objectKey,inputStream); PutObjectRequest request = new PutObjectRequest(bucketName,destPath,inputStream); ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(available); request.setMetadata(objectMetadata); // request. // 设置对象访问权限为公共读 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()); 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; } }