Search in sources :

Example 16 with UploadResult

use of run.halo.app.model.support.UploadResult in project halo-plugin-experimental by guqing.

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(HaloConst.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(HaloConst.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("上传附件失败").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) FilePathDescriptor(run.halo.app.handler.file.FilePathDescriptor) BufferedImage(java.awt.image.BufferedImage) NonNull(org.springframework.lang.NonNull)

Example 17 with UploadResult

use of run.halo.app.model.support.UploadResult in project halo by ruibaby.

the class QiniuOssFileHandler method upload.

@Override
public UploadResult upload(MultipartFile file) {
    Assert.notNull(file, "Multipart file must not be null");
    Region region = optionService.getQiniuRegion();
    String accessKey = optionService.getByPropertyOfNonNull(QiniuOssProperties.OSS_ACCESS_KEY).toString();
    String secretKey = optionService.getByPropertyOfNonNull(QiniuOssProperties.OSS_SECRET_KEY).toString();
    String bucket = optionService.getByPropertyOfNonNull(QiniuOssProperties.OSS_BUCKET).toString();
    String protocol = optionService.getByPropertyOfNonNull(QiniuOssProperties.OSS_PROTOCOL).toString();
    String domain = optionService.getByPropertyOfNonNull(QiniuOssProperties.OSS_DOMAIN).toString();
    String source = optionService.getByPropertyOrDefault(QiniuOssProperties.OSS_SOURCE, String.class, "");
    String styleRule = optionService.getByPropertyOrDefault(QiniuOssProperties.OSS_STYLE_RULE, String.class, "");
    String thumbnailStyleRule = optionService.getByPropertyOrDefault(QiniuOssProperties.OSS_THUMBNAIL_STYLE_RULE, String.class, "");
    // Create configuration
    Configuration configuration = new Configuration(region);
    // Create auth
    Auth auth = Auth.create(accessKey, secretKey);
    // Build put plicy
    StringMap putPolicy = new StringMap();
    putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"size\":$(fsize),\"width\":$(imageInfo" + ".width),\"height\":$(imageInfo.height)}");
    // Get upload token
    String uploadToken = auth.uploadToken(bucket, null, 60 * 60, putPolicy);
    // Create temp path
    Path tmpPath = Paths.get(ensureSuffix(TEMP_DIR, FILE_SEPARATOR), bucket);
    StringBuilder basePath = new StringBuilder(protocol).append(domain).append(URL_SEPARATOR);
    try {
        FilePathDescriptor pathDescriptor = new FilePathDescriptor.Builder().setBasePath(basePath.toString()).setSubPath(source).setAutomaticRename(true).setRenamePredicate(relativePath -> attachmentRepository.countByFileKeyAndType(relativePath, AttachmentType.QINIUOSS) > 0).setOriginalName(file.getOriginalFilename()).build();
        // Get file recorder for temp directory
        FileRecorder fileRecorder = new FileRecorder(tmpPath.toFile());
        // Get upload manager
        UploadManager uploadManager = new UploadManager(configuration, fileRecorder);
        // Put the file
        Response response = uploadManager.put(file.getInputStream(), pathDescriptor.getRelativePath(), uploadToken, null, null);
        if (log.isDebugEnabled()) {
            log.debug("Qiniu oss response: [{}]", response.toString());
            log.debug("Qiniu oss response body: [{}]", response.bodyString());
        }
        // Convert response
        PutSet putSet = JsonUtils.jsonToObject(response.bodyString(), PutSet.class);
        // Get file full path
        String fullPath = pathDescriptor.getFullPath();
        // Build upload result
        UploadResult result = new UploadResult();
        result.setFilename(pathDescriptor.getName());
        result.setFilePath(StringUtils.isBlank(styleRule) ? fullPath : fullPath + styleRule);
        result.setKey(pathDescriptor.getRelativePath());
        result.setSuffix(pathDescriptor.getExtension());
        result.setWidth(putSet.getWidth());
        result.setHeight(putSet.getHeight());
        result.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));
        result.setSize(file.getSize());
        if (isImageType(file)) {
            if (ImageUtils.EXTENSION_ICO.equals(pathDescriptor.getExtension())) {
                result.setThumbPath(fullPath);
            } else {
                result.setThumbPath(StringUtils.isBlank(thumbnailStyleRule) ? fullPath : fullPath + thumbnailStyleRule);
            }
        }
        return result;
    } catch (IOException e) {
        if (e instanceof QiniuException) {
            log.error("Qiniu oss error response: [{}]", ((QiniuException) e).response);
        }
        throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到七牛云失败", e);
    }
}
Also used : Path(java.nio.file.Path) StringMap(com.qiniu.util.StringMap) Configuration(com.qiniu.storage.Configuration) FileOperationException(run.halo.app.exception.FileOperationException) FileRecorder(com.qiniu.storage.persistent.FileRecorder) IOException(java.io.IOException) Response(com.qiniu.http.Response) QiniuException(com.qiniu.common.QiniuException) Auth(com.qiniu.util.Auth) Region(com.qiniu.storage.Region) UploadResult(run.halo.app.model.support.UploadResult) UploadManager(com.qiniu.storage.UploadManager)

Example 18 with UploadResult

use of run.halo.app.model.support.UploadResult in project halo by ruibaby.

the class TencentCosFileHandler method upload.

@Override
public UploadResult upload(MultipartFile file) {
    Assert.notNull(file, "Multipart file must not be null");
    // Get config
    String protocol = optionService.getByPropertyOfNonNull(TencentCosProperties.COS_PROTOCOL).toString();
    String domain = optionService.getByPropertyOrDefault(TencentCosProperties.COS_DOMAIN, String.class, "");
    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();
    String source = optionService.getByPropertyOrDefault(TencentCosProperties.COS_SOURCE, String.class, "");
    String styleRule = optionService.getByPropertyOrDefault(TencentCosProperties.COS_STYLE_RULE, String.class, "");
    String thumbnailStyleRule = optionService.getByPropertyOrDefault(TencentCosProperties.COS_THUMBNAIL_STYLE_RULE, String.class, "");
    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);
    StringBuilder basePath = new StringBuilder(protocol);
    if (StringUtils.isNotEmpty(domain)) {
        basePath.append(domain).append(URL_SEPARATOR);
    } else {
        basePath.append(bucketName).append(".cos.").append(region).append(".myqcloud.com").append(URL_SEPARATOR);
    }
    try {
        FilePathDescriptor pathDescriptor = new FilePathDescriptor.Builder().setBasePath(basePath.toString()).setSubPath(source).setAutomaticRename(true).setRenamePredicate(relativePath -> attachmentRepository.countByFileKeyAndType(relativePath, AttachmentType.TENCENTCOS) > 0).setOriginalName(file.getOriginalFilename()).build();
        // Upload
        ObjectMetadata objectMetadata = new ObjectMetadata();
        // 提前告知输入流的长度, 否则可能导致 oom
        objectMetadata.setContentLength(file.getSize());
        // 设置 Content type, 默认是 application/octet-stream
        objectMetadata.setContentType(file.getContentType());
        PutObjectResult putObjectResponseFromInputStream = cosClient.putObject(bucketName, pathDescriptor.getRelativePath(), file.getInputStream(), objectMetadata);
        if (putObjectResponseFromInputStream == null) {
            throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到腾讯云失败 ");
        }
        String fullPath = pathDescriptor.getFullPath();
        // Response result
        UploadResult uploadResult = new UploadResult();
        uploadResult.setFilename(pathDescriptor.getName());
        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());
        // Handle thumbnail
        handleImageMetadata(file, uploadResult, () -> {
            if (ImageUtils.EXTENSION_ICO.equals(pathDescriptor.getExtension())) {
                uploadResult.setThumbPath(fullPath);
                return fullPath;
            } else {
                return StringUtils.isBlank(thumbnailStyleRule) ? fullPath : fullPath + thumbnailStyleRule;
            }
        });
        return uploadResult;
    } catch (Exception e) {
        throw new FileOperationException("附件 " + file.getOriginalFilename() + " 上传失败(腾讯云)", e);
    } finally {
        cosClient.shutdown();
    }
}
Also used : COSCredentials(com.qcloud.cos.auth.COSCredentials) BasicCOSCredentials(com.qcloud.cos.auth.BasicCOSCredentials) BasicCOSCredentials(com.qcloud.cos.auth.BasicCOSCredentials) PutObjectResult(com.qcloud.cos.model.PutObjectResult) FileOperationException(run.halo.app.exception.FileOperationException) FileOperationException(run.halo.app.exception.FileOperationException) COSClient(com.qcloud.cos.COSClient) Region(com.qcloud.cos.region.Region) UploadResult(run.halo.app.model.support.UploadResult) ClientConfig(com.qcloud.cos.ClientConfig) ObjectMetadata(com.qcloud.cos.model.ObjectMetadata)

Example 19 with UploadResult

use of run.halo.app.model.support.UploadResult in project halo by ruibaby.

the class MinioFileHandler method upload.

@NonNull
@Override
public UploadResult upload(@NonNull MultipartFile file) {
    Assert.notNull(file, "Multipart file must not be null");
    // Get config
    String endpoint = optionService.getByPropertyOfNonNull(MinioProperties.ENDPOINT).toString();
    String accessKey = optionService.getByPropertyOfNonNull(MinioProperties.ACCESS_KEY).toString();
    String accessSecret = optionService.getByPropertyOfNonNull(MinioProperties.ACCESS_SECRET).toString();
    String bucketName = optionService.getByPropertyOfNonNull(MinioProperties.BUCKET_NAME).toString();
    String source = optionService.getByPropertyOrDefault(MinioProperties.SOURCE, String.class, "");
    String region = optionService.getByPropertyOrDefault(MinioProperties.REGION, String.class, "us-east-1");
    endpoint = StringUtils.appendIfMissing(endpoint, HaloConst.URL_SEPARATOR);
    MinioClient minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, accessSecret).region(region).build();
    try {
        FilePathDescriptor pathDescriptor = new FilePathDescriptor.Builder().setBasePath(endpoint + bucketName).setSubPath(source).setAutomaticRename(true).setRenamePredicate(relativePath -> attachmentRepository.countByFileKeyAndType(relativePath, AttachmentType.MINIO) > 0).setOriginalName(file.getOriginalFilename()).build();
        PutObjectArgs putObjectArgs = PutObjectArgs.builder().contentType(file.getContentType()).bucket(bucketName).stream(file.getInputStream(), file.getSize(), -1).object(pathDescriptor.getRelativePath()).build();
        minioClient.ignoreCertCheck();
        minioClient.putObject(putObjectArgs);
        UploadResult uploadResult = new UploadResult();
        uploadResult.setFilename(pathDescriptor.getName());
        uploadResult.setFilePath(pathDescriptor.getFullPath());
        uploadResult.setKey(pathDescriptor.getRelativePath());
        uploadResult.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));
        uploadResult.setSuffix(pathDescriptor.getExtension());
        uploadResult.setSize(file.getSize());
        // Handle thumbnail
        handleImageMetadata(file, uploadResult, pathDescriptor::getFullPath);
        return uploadResult;
    } catch (Exception e) {
        log.error("upload file to MINIO failed", e);
        throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到 MinIO 失败 ", e).setErrorData(e.getMessage());
    }
}
Also used : MinioClient(io.minio.MinioClient) FileOperationException(run.halo.app.exception.FileOperationException) PutObjectArgs(io.minio.PutObjectArgs) UploadResult(run.halo.app.model.support.UploadResult) FileOperationException(run.halo.app.exception.FileOperationException) NonNull(org.springframework.lang.NonNull)

Example 20 with UploadResult

use of run.halo.app.model.support.UploadResult in project halo by ruibaby.

the class UpOssFileHandler method upload.

@Override
public UploadResult upload(MultipartFile file) {
    Assert.notNull(file, "Multipart file must not be null");
    String source = optionService.getByPropertyOfNonNull(UpOssProperties.OSS_SOURCE).toString();
    String password = optionService.getByPropertyOfNonNull(UpOssProperties.OSS_PASSWORD).toString();
    String bucket = optionService.getByPropertyOfNonNull(UpOssProperties.OSS_BUCKET).toString();
    String protocol = optionService.getByPropertyOfNonNull(UpOssProperties.OSS_PROTOCOL).toString();
    String domain = optionService.getByPropertyOfNonNull(UpOssProperties.OSS_DOMAIN).toString();
    String operator = optionService.getByPropertyOfNonNull(UpOssProperties.OSS_OPERATOR).toString();
    // style rule can be null
    String styleRule = optionService.getByPropertyOrDefault(UpOssProperties.OSS_STYLE_RULE, String.class, "");
    String thumbnailStyleRule = optionService.getByPropertyOrDefault(UpOssProperties.OSS_THUMBNAIL_STYLE_RULE, String.class, "");
    RestManager manager = new RestManager(bucket, operator, password);
    manager.setTimeout(60 * 10);
    manager.setApiDomain(RestManager.ED_AUTO);
    Map<String, String> params = new HashMap<>();
    try {
        // Get file basename
        String basename = FilenameUtils.getBasename(Objects.requireNonNull(file.getOriginalFilename()));
        // Get file extension
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        // Get md5 value of the file
        String md5OfFile = DigestUtils.md5DigestAsHex(file.getInputStream());
        // Build file path
        String upFilePath = StringUtils.appendIfMissing(source, "/") + md5OfFile + '.' + extension;
        // Set md5Content
        params.put(RestManager.PARAMS.CONTENT_MD5.getValue(), md5OfFile);
        // Write file
        Response result = manager.writeFile(upFilePath, file.getInputStream(), params);
        if (!result.isSuccessful()) {
            throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到又拍云失败" + upFilePath);
        }
        String filePath = protocol + StringUtils.removeEnd(domain, "/") + upFilePath;
        // Build upload result
        UploadResult uploadResult = new UploadResult();
        uploadResult.setFilename(basename);
        uploadResult.setFilePath(StringUtils.isBlank(styleRule) ? filePath : filePath + styleRule);
        uploadResult.setKey(upFilePath);
        uploadResult.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));
        uploadResult.setSuffix(extension);
        uploadResult.setSize(file.getSize());
        // Handle thumbnail
        handleImageMetadata(file, uploadResult, () -> {
            if (ImageUtils.EXTENSION_ICO.equals(extension)) {
                uploadResult.setThumbPath(filePath);
                return filePath;
            } else {
                return StringUtils.isBlank(thumbnailStyleRule) ? filePath : filePath + thumbnailStyleRule;
            }
        });
        result.close();
        return uploadResult;
    } catch (Exception e) {
        throw new FileOperationException("上传附件 " + file.getOriginalFilename() + " 到又拍云失败", e);
    }
}
Also used : Response(okhttp3.Response) HashMap(java.util.HashMap) FileOperationException(run.halo.app.exception.FileOperationException) RestManager(com.upyun.RestManager) UploadResult(run.halo.app.model.support.UploadResult) FileOperationException(run.halo.app.exception.FileOperationException) IOException(java.io.IOException) UpException(com.upyun.UpException)

Aggregations

UploadResult (run.halo.app.model.support.UploadResult)30 FileOperationException (run.halo.app.exception.FileOperationException)27 IOException (java.io.IOException)15 NonNull (org.springframework.lang.NonNull)12 Path (java.nio.file.Path)6 OSS (com.aliyun.oss.OSS)3 OSSClientBuilder (com.aliyun.oss.OSSClientBuilder)3 PutObjectResult (com.aliyun.oss.model.PutObjectResult)3 DefaultBceCredentials (com.baidubce.auth.DefaultBceCredentials)3 BosClient (com.baidubce.services.bos.BosClient)3 BosClientConfiguration (com.baidubce.services.bos.BosClientConfiguration)3 PutObjectResponse (com.baidubce.services.bos.model.PutObjectResponse)3 ObsClient (com.obs.services.ObsClient)3 PutObjectResult (com.obs.services.model.PutObjectResult)3 COSClient (com.qcloud.cos.COSClient)3 ClientConfig (com.qcloud.cos.ClientConfig)3 BasicCOSCredentials (com.qcloud.cos.auth.BasicCOSCredentials)3 COSCredentials (com.qcloud.cos.auth.COSCredentials)3 ObjectMetadata (com.qcloud.cos.model.ObjectMetadata)3 PutObjectResult (com.qcloud.cos.model.PutObjectResult)3