use of run.halo.app.exception.FileOperationException in project halo by ruibaby.
the class HuaweiObsFileHandler method upload.
@Override
@NonNull
public UploadResult upload(@NonNull MultipartFile file) {
Assert.notNull(file, "Multipart file must not be null");
// Get config
String protocol = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_PROTOCOL).toString();
String domain = optionService.getByPropertyOrDefault(HuaweiObsProperties.OSS_DOMAIN, String.class, "");
String source = optionService.getByPropertyOrDefault(HuaweiObsProperties.OSS_SOURCE, String.class, "");
String endPoint = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_ENDPOINT).toString();
String accessKey = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_ACCESS_KEY).toString();
String accessSecret = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_ACCESS_SECRET).toString();
String bucketName = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_BUCKET_NAME).toString();
String styleRule = optionService.getByPropertyOrDefault(HuaweiObsProperties.OSS_STYLE_RULE, String.class, "");
String thumbnailStyleRule = optionService.getByPropertyOrDefault(HuaweiObsProperties.OSS_THUMBNAIL_STYLE_RULE, String.class, "");
// Init OSS client
final ObsClient obsClient = new ObsClient(accessKey, accessSecret, endPoint);
StringBuilder basePath = new StringBuilder(protocol);
if (StringUtils.isNotEmpty(domain)) {
basePath.append(domain).append(URL_SEPARATOR);
} else {
basePath.append(bucketName).append(".").append(endPoint).append(URL_SEPARATOR);
}
try {
FilePathDescriptor pathDescriptor = new FilePathDescriptor.Builder().setBasePath(basePath.toString()).setSubPath(source).setAutomaticRename(true).setRenamePredicate(relativePath -> attachmentRepository.countByFileKeyAndType(relativePath, AttachmentType.HUAWEIOBS) > 0).setOriginalName(file.getOriginalFilename()).build();
log.info(basePath.toString());
// Upload
PutObjectResult putObjectResult = obsClient.putObject(bucketName, pathDescriptor.getRelativePath(), file.getInputStream());
if (putObjectResult == null) {
throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到华为云失败 ");
}
// Response result
UploadResult uploadResult = new UploadResult();
uploadResult.setFilename(pathDescriptor.getName());
String fullPath = pathDescriptor.getFullPath();
uploadResult.setFilePath(StringUtils.isBlank(styleRule) ? fullPath : fullPath + styleRule);
uploadResult.setKey(pathDescriptor.getRelativePath());
uploadResult.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));
uploadResult.setSuffix(pathDescriptor.getExtension());
uploadResult.setSize(file.getSize());
handleImageMetadata(file, uploadResult, () -> {
if (ImageUtils.EXTENSION_ICO.equals(pathDescriptor.getExtension())) {
return fullPath;
} else {
return StringUtils.isBlank(thumbnailStyleRule) ? fullPath : fullPath + thumbnailStyleRule;
}
});
log.info("Uploaded file: [{}] successfully", file.getOriginalFilename());
return uploadResult;
} catch (Exception e) {
throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到华为云失败 ", e).setErrorData(file.getOriginalFilename());
} finally {
try {
obsClient.close();
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
use of run.halo.app.exception.FileOperationException in project halo by ruibaby.
the class HuaweiObsFileHandler method delete.
@Override
public void delete(@NonNull String key) {
Assert.notNull(key, "File key must not be blank");
// Get config
String endPoint = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_ENDPOINT).toString();
String accessKey = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_ACCESS_KEY).toString();
String accessSecret = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_ACCESS_SECRET).toString();
String bucketName = optionService.getByPropertyOfNonNull(HuaweiObsProperties.OSS_BUCKET_NAME).toString();
// Init OSS client
final ObsClient obsClient = new ObsClient(accessKey, accessSecret, endPoint);
try {
obsClient.deleteObject(bucketName, key);
} catch (Exception e) {
throw new FileOperationException("附件 " + key + " 从华为云删除失败", e);
} finally {
try {
obsClient.close();
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
use of run.halo.app.exception.FileOperationException in project halo by ruibaby.
the class LocalFileHandler method upload.
@NonNull
@Override
public UploadResult upload(@NonNull MultipartFile file) {
Assert.notNull(file, "Multipart file must not be null");
FilePathDescriptor uploadFilePath = new FilePathDescriptor.Builder().setBasePath(workDir).setSubPath(generatePath()).setSeparator(FILE_SEPARATOR).setAutomaticRename(true).setRenamePredicate(relativePath -> attachmentRepository.countByFileKeyAndType(relativePath, AttachmentType.LOCAL) > 0).setOriginalName(file.getOriginalFilename()).build();
log.info("Uploading file: [{}] to directory: [{}]", file.getOriginalFilename(), uploadFilePath.getRelativePath());
Path localFileFullPath = Paths.get(uploadFilePath.getFullPath());
try {
// TODO Synchronize here
// Create directory
Files.createDirectories(localFileFullPath.getParent());
Files.createFile(localFileFullPath);
// Upload this file
file.transferTo(localFileFullPath);
// Build upload result
UploadResult uploadResult = new UploadResult();
uploadResult.setFilename(uploadFilePath.getName());
uploadResult.setFilePath(uploadFilePath.getRelativePath());
uploadResult.setKey(uploadFilePath.getRelativePath());
uploadResult.setSuffix(uploadFilePath.getExtension());
uploadResult.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));
uploadResult.setSize(file.getSize());
// TODO refactor this: if image is svg ext. extension
handleImageMetadata(file, uploadResult, () -> {
// Upload a thumbnail
FilePathDescriptor thumbnailFilePath = new FilePathDescriptor.Builder().setBasePath(workDir).setSubPath(uploadFilePath.getSubPath()).setSeparator(FILE_SEPARATOR).setOriginalName(uploadFilePath.getFullName()).setNameSuffix(THUMBNAIL_SUFFIX).build();
final Path thumbnailPath = Paths.get(thumbnailFilePath.getFullPath());
try (InputStream is = file.getInputStream()) {
// Generate thumbnail
BufferedImage originalImage = ImageUtils.getImageFromFile(is, uploadFilePath.getExtension());
boolean result = generateThumbnail(originalImage, thumbnailPath, uploadFilePath.getExtension());
if (result) {
// Set thumb path
return thumbnailFilePath.getRelativePath();
}
} catch (Throwable e) {
log.warn("Failed to open image file.", e);
}
return uploadFilePath.getRelativePath();
});
log.info("Uploaded file: [{}] to directory: [{}] successfully", file.getOriginalFilename(), uploadFilePath.getFullPath());
return uploadResult;
} catch (IOException e) {
throw new FileOperationException("上传附件失败", e).setErrorData(uploadFilePath.getFullPath());
}
}
use of run.halo.app.exception.FileOperationException in project halo by ruibaby.
the class SmmsFileHandler method upload.
@Override
public UploadResult upload(MultipartFile file) {
Assert.notNull(file, "Multipart file must not be null");
String apiSecretToken = optionService.getByPropertyOfNonNull(SmmsProperties.SMMS_API_SECRET_TOKEN).toString();
if (StringUtils.isEmpty(apiSecretToken)) {
throw new ServiceException("请先设置 SM.MS 的 Secret Token");
}
if (!isImageType(file)) {
log.error("Invalid extension: [{}]", file.getContentType());
throw new FileOperationException("不支持的文件类型,仅支持 \"jpeg, jpg, png, gif, bmp\" 格式的图片");
}
setHeaders();
// Set content type
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
LinkedMultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
try {
body.add("smfile", new HttpClientUtils.MultipartFileResource(file.getBytes(), file.getOriginalFilename()));
} catch (IOException e) {
log.error("Failed to get file input stream", e);
throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到 SM.MS 失败", e);
}
body.add("format", "json");
HttpEntity<LinkedMultiValueMap<String, Object>> httpEntity = new HttpEntity<>(body, headers);
// Upload file
ResponseEntity<SmmsResponse> mapResponseEntity = httpsRestTemplate.postForEntity(UPLOAD_API_V2, httpEntity, SmmsResponse.class);
// Check status
if (mapResponseEntity.getStatusCode().isError()) {
log.error("Server response detail: [{}]", mapResponseEntity);
throw new FileOperationException("SM.MS 服务状态异常,状态码: " + mapResponseEntity.getStatusCodeValue());
}
// Get smms response
SmmsResponse smmsResponse = mapResponseEntity.getBody();
// Check error
if (!isResponseSuccessfully(smmsResponse)) {
log.error("Smms response detail: [{}]", smmsResponse);
throw new FileOperationException(smmsResponse == null ? "SM.MS 服务返回内容为空" : smmsResponse.getMessage()).setErrorData(smmsResponse);
}
if (!smmsResponse.getSuccess()) {
throw new FileOperationException("上传请求失败:" + smmsResponse.getMessage()).setErrorData(smmsResponse);
}
// Get response data
SmmsResponseData data = smmsResponse.getData();
// Build result
UploadResult result = new UploadResult();
result.setFilename(FilenameUtils.getBasename(Objects.requireNonNull(file.getOriginalFilename())));
result.setSuffix(FilenameUtils.getExtension(file.getOriginalFilename()));
result.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));
result.setFilePath(data.getUrl());
result.setThumbPath(data.getUrl());
result.setKey(data.getHash());
result.setWidth(data.getWidth());
result.setHeight(data.getHeight());
result.setSize(data.getSize().longValue());
log.info("File: [{}] uploaded successfully", file.getOriginalFilename());
return result;
}
use of run.halo.app.exception.FileOperationException in project halo by ruibaby.
the class TencentCosFileHandler method delete.
@Override
public void delete(String key) {
Assert.notNull(key, "File key must not be blank");
// Get config
String region = optionService.getByPropertyOfNonNull(TencentCosProperties.COS_REGION).toString();
String secretId = optionService.getByPropertyOfNonNull(TencentCosProperties.COS_SECRET_ID).toString();
String secretKey = optionService.getByPropertyOfNonNull(TencentCosProperties.COS_SECRET_KEY).toString();
String bucketName = optionService.getByPropertyOfNonNull(TencentCosProperties.COS_BUCKET_NAME).toString();
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
Region regionConfig = new Region(region);
ClientConfig clientConfig = new ClientConfig(regionConfig);
// Init OSS client
COSClient cosClient = new COSClient(cred, clientConfig);
try {
cosClient.deleteObject(bucketName, key);
} catch (Exception e) {
throw new FileOperationException("附件 " + key + " 从腾讯云删除失败", e);
} finally {
cosClient.shutdown();
}
}
Aggregations