Search in sources :

Example 31 with FileOperationException

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());
        }
    }
}
Also used : PutObjectResult(com.obs.services.model.PutObjectResult) FileOperationException(run.halo.app.exception.FileOperationException) UploadResult(run.halo.app.model.support.UploadResult) IOException(java.io.IOException) ObsClient(com.obs.services.ObsClient) FileOperationException(run.halo.app.exception.FileOperationException) IOException(java.io.IOException) NonNull(org.springframework.lang.NonNull)

Example 32 with FileOperationException

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());
        }
    }
}
Also used : FileOperationException(run.halo.app.exception.FileOperationException) IOException(java.io.IOException) ObsClient(com.obs.services.ObsClient) FileOperationException(run.halo.app.exception.FileOperationException) IOException(java.io.IOException)

Example 33 with FileOperationException

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());
    }
}
Also used : Path(java.nio.file.Path) InputStream(java.io.InputStream) FileOperationException(run.halo.app.exception.FileOperationException) UploadResult(run.halo.app.model.support.UploadResult) IOException(java.io.IOException) BufferedImage(java.awt.image.BufferedImage) NonNull(org.springframework.lang.NonNull)

Example 34 with FileOperationException

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;
}
Also used : HttpEntity(org.springframework.http.HttpEntity) LinkedMultiValueMap(org.springframework.util.LinkedMultiValueMap) FileOperationException(run.halo.app.exception.FileOperationException) IOException(java.io.IOException) HttpClientUtils(run.halo.app.utils.HttpClientUtils) ServiceException(run.halo.app.exception.ServiceException) UploadResult(run.halo.app.model.support.UploadResult)

Example 35 with FileOperationException

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();
    }
}
Also used : COSClient(com.qcloud.cos.COSClient) COSCredentials(com.qcloud.cos.auth.COSCredentials) BasicCOSCredentials(com.qcloud.cos.auth.BasicCOSCredentials) BasicCOSCredentials(com.qcloud.cos.auth.BasicCOSCredentials) FileOperationException(run.halo.app.exception.FileOperationException) Region(com.qcloud.cos.region.Region) ClientConfig(com.qcloud.cos.ClientConfig) FileOperationException(run.halo.app.exception.FileOperationException)

Aggregations

FileOperationException (run.halo.app.exception.FileOperationException)69 IOException (java.io.IOException)39 UploadResult (run.halo.app.model.support.UploadResult)27 Path (java.nio.file.Path)24 NonNull (org.springframework.lang.NonNull)15 ServiceException (run.halo.app.exception.ServiceException)9 OSS (com.aliyun.oss.OSS)6 OSSClientBuilder (com.aliyun.oss.OSSClientBuilder)6 DefaultBceCredentials (com.baidubce.auth.DefaultBceCredentials)6 BosClient (com.baidubce.services.bos.BosClient)6 BosClientConfiguration (com.baidubce.services.bos.BosClientConfiguration)6 ObsClient (com.obs.services.ObsClient)6 COSClient (com.qcloud.cos.COSClient)6 ClientConfig (com.qcloud.cos.ClientConfig)6 BasicCOSCredentials (com.qcloud.cos.auth.BasicCOSCredentials)6 COSCredentials (com.qcloud.cos.auth.COSCredentials)6 Region (com.qcloud.cos.region.Region)6 QiniuException (com.qiniu.common.QiniuException)6 Response (com.qiniu.http.Response)6 Configuration (com.qiniu.storage.Configuration)6