All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.cloudscope.oss.service.StorageWorker Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
package cn.cloudscope.oss.service;

import cn.cloudscope.oss.bean.DocumentUrlResult;
import cn.cloudscope.oss.bean.UploadResult;
import cn.cloudscope.oss.utils.FileUtil;
import cn.cloudscope.oss.utils.ImageUtil;
import cn.cloudscope.oss.utils.PathUtil;
import cn.cloudscope.oss.utils.VideoUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 文件存储接口
 * @author wupanhua
 * @date 2018-09-11
 */
public interface StorageWorker {

    Logger log = LoggerFactory.getLogger(StorageWorker.class);

    String SUFFIX_THUMBNAIL = "-thumbnail";

    String SUFFIX_BACKUP = "-backup";

    /**
     * 上传文件
     * @param inputStream       文件流
     * @param fileName          文件名
     * @param folder            目标文件夹
     * @param thumbnail         是否生成缩略图
     * @author wenxiaopeng
     * @date 2021/07/09 12:07
     * @return 文件上传后的路径
     **/
    UploadResult upload(InputStream inputStream, String fileName, String folder, boolean thumbnail);

    /**
     * 上传文件,若是图片的话,生成缩略图
     * @param inputStream       文件流
     * @param fileName          文件名
     * @param folder            目标文件夹
     * @author wenxiaopeng
     * @date 2021/07/09 12:07
     * @return 文件上传后的路径
     **/
    default UploadResult upload(InputStream inputStream, String fileName, String folder) {
        return upload(inputStream, fileName, folder, false);
    }

    /**
     * 上传文件
     * @param inputStream       文件流
     * @param fileName          文件名
     * @author wenxiaopeng
     * @date 2021/07/09 12:07
     * @return 文件上传后的路径
     **/
    default UploadResult upload(InputStream inputStream, String fileName) {
        return upload(inputStream, fileName, null, true);
    }

    /**
     * 上传文件
     * @param file  目标文件
     * @param folder    上传文件夹,可为空,且推荐为空
     * @author wenxiaopeng
     * @date 2022/7/27 14:22
     * @return cn.net.idso.bean.UploadResult
     **/
    default UploadResult upload(File file, String folder) {
        UploadResult result = new UploadResult();
        try(InputStream fis = new FileInputStream(file)) {
            return upload(fis, file.getName(), folder, true);
        } catch (IOException e) {
            log.error("文件上传失败:{}", e.getMessage());
        }
        return result;
    }

    /**
     * 待实现的文件上传接口
     * @param stream    文件流
     * @param path      远程路径
     * @param originName
     * @author wenxiaopeng
     * @date 2022/7/27 16:17
     * @return  远程文件路径
     * */
    String doUpload(InputStream stream, String path, String originName);

    /**
     * 待实现的文件上传接口
     * @param file    文件
     * @param path      远程路径
     * @author wenxiaopeng
     * @date 2022/7/27 16:17
     * @return  远程文件路径
     * @throws IOException File Not Found
     * */
    default String doUpload(File file, String path) throws IOException {
        return doUpload(Files.newInputStream(file.toPath()), path, null);
    }

    /**
     * 上传文件
     * @param filePath  目标文件
     * @param folder    上传文件夹,可为空,且推荐为空
     * @author wenxiaopeng
     * @date 2022/7/27 14:22
     * @return cn.net.idso.bean.UploadResult
     **/
    default UploadResult upload(String filePath, String folder) {
        return upload(new File(filePath), folder);
    }

    /**
     * 上传文件
     * @param file  目标文件
     * @author wenxiaopeng
     * @date 2022/7/27 14:22
     * @return cn.net.idso.bean.UploadResult
     **/
    default UploadResult upload(File file) {
        return upload(file, null);
    }

    /**
     * 单独创建文件缩略图,或可在上传时直接生成 {@link #upload(InputStream, String, String, boolean)}
     * @param path      图片OSS地址
     * @param file      原图片
     * @author wenxiaopeng
     * @date 2023/2/2 12:19
     * @return java.lang.String
     **/
    default String buildThumbnail(String path, File file) {
        try {
            String suffix = FileUtil.getFileSuffix(file.getName());

            if(ImageUtil.isImage(file)) {
                InputStream thumbnailStream = ImageUtil.buildThumbnail(new FileInputStream(file), suffix);
                if(null != thumbnailStream && thumbnailStream.available() > 0) {
                    return this.doUpload(thumbnailStream, ImageUtil.appendSuffixHyphenThumbnail(path), null);
                }

            } else {
                if (VideoUtil.isVideo(file)) {
                    InputStream frameStream = VideoUtil.captureFrame(file, 20);
                    String framePath = StringUtils.substringBeforeLast(path, ".") + ".jpg";
                    if(null != frameStream) {
                        this.doUpload(frameStream, framePath, null);
                        return framePath;
                    }
                }
            }
        } catch (Exception e){
            log.error("无法生成缩略图: {}", e.getMessage());
        }
        return null;
    }

    /**
     * 
     * <添加文件后缀>
     *
     * @param fileName 文件名(可以包含路径)
     * @param suffix 要添加的文件后缀
     * @author wupanhua
     * @date 11:14 2020-03-03
     * @return 添加后缀后的新文件名
     */
    default String appendSuffix(String fileName, String suffix) {

        String newFileName;
        int indexOfDot = fileName.lastIndexOf('.');
        if (indexOfDot != -1) {
            newFileName = fileName.substring(0, indexOfDot);
            newFileName += suffix;
            newFileName += fileName.substring(indexOfDot);
        } else {
            newFileName = fileName + suffix;
        }

        return newFileName;
    }

    /**
     * 下载文件
     * @param key       文件路径
     * @author wenxiaopeng
     * @date 2021/07/09 12:08
     * @return java.io.InputStream
     **/
    InputStream download(String key);

    /**
     * 下载文件到指定输出流
     * @param key   文件minio路径
     * @param response  响应流
     * @author wangkp
     * @date 13:28 2022/1/25
     **/
    void download(String key, OutputStream response);

    /**
     * 复制文件
     * @author WZW
     * @date 14:02 2022/7/5
     * @param originPath 文件前缀路径
     * @param deleteOrigin  是否删除原文件
     * @return 备份后的文件路径
     **/
    String backupFile(String originPath, boolean deleteOrigin);

    /**
     * 根据路径删除文件
     * @author songcx
     * @date 14:31 2021/2/2
     * @param path 1
     * @return boolean
     **/
    boolean deleteFile(String path);


    /**
     * 获取一个可访问的文件链接
     * @param key           文件路径
     * @param expiresIn     过期时间(秒),默认7天
     * @author wenxiaopeng
     * @date 2021/07/09 12:11
     * @return DocumentUrlResult
     **/
    DocumentUrlResult getDocumentUrl(String key, int expiresIn);


    /**
     * 上传多个文件
     * @param files 待上传文件列表
     * @return 上传文件成功后的结果集
     * @author wupanhua
     */
    UploadResult uploadMultipleFile(List files);

    /**
     * <创建一个指定有效期的数据访问链接>
     * @author wupanhua
     * @date 11:30 2020-03-03
     * @param path oss存储路径
     * @param expire 有效时间(s)
     * @return 签名后的路径,可直接访问
     */
    String crateFileExpireUrl(String path, int expire);

    /**
     * 
     * <创建一个指定有效期的图片访问链接>
     * @author wupanhua
     * @date 11:30 2020-03-03
     * @param path oss存储路径
     * @param expire 有效时间(s)
     * @return void
     */
    UploadResult createImgExpireUrl(String path, int expire);

    /**
     * 按规则生成文件路径(年月及文件名hash)
     * @param fileName  文件名
     * @author wenxiaopeng
     * @date 2023/9/16 14:45
     * @return java.lang.String
     **/
    default String generatePath(String fileName) {
        return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM")) + "/" + PathUtil.generatePath(fileName) + "/" + fileName;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy