静态内部类解决静态变量注入问题

1.静态变量不可直接注入,可通过setter的方式注入,且setter方法不能为static,实际上是在静态变量被加载并默认初始化过后,初始化bean时被注入的

2.静态内部类可在bean被初始化之后再加载,从而实现利用外部类静态变量的目的

3.变量的注入,需要注意变量名的统一



public class OssClient {
    //log
    private  Logger logger = LoggerFactory.getLogger(this.getClass());

    //阿里云API的内或外网域名
    private static String END_POINT;
    //阿里云API的密钥Access Key ID
    private static String ACCESS_KEY_ID;
    //阿里云API的密钥Access Key Secret
    private static String ACCESS_KEY_SECRET;

    //阿里云API的BUCKET_NAME
    private static String BUCKET_NAME;

//静态内部类在上述bean的属性被初始化后再加载
    public static class clientSingletonHolder{
        //init on demand
        static  OSSClient client = new OSSClient(END_POINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    }

//    private static OSSClient client = new OSSClient(END_POINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);//会出现null错


    /**
     * 获取阿里云OSS客户端对象
     * */
    public OSSClient getOSSClient(){
        return clientSingletonHolder.client;
    }
    /**
     * 上传文件+参数为流
     * @param bucketName
     * @param fileName
     * @param fileSuffix
     * @param fileContent
     * @param ossPath
     * @return
     * @throws IOException
     */
    public void uploadFile(String bucketName, String fileName, String fileSuffix,
                           InputStream fileContent, String ossPath) throws IOException {

        ObjectMetadata objectMetadata=new ObjectMetadata();
        objectMetadata.setContentLength(fileContent.available());
        objectMetadata.setCacheControl("no-cache");
        objectMetadata.setHeader("Pragma", "no-cache");
        objectMetadata.setContentType(fileSuffix);
        objectMetadata.setContentDisposition("inline;filename=" + fileName);

        //上传文件,bucket名称 + 路径.文件名 + 文件流 + 对上传文件的描述
        try {
            getOSSClient().putObject(bucketName, ossPath.substring(1, ossPath.length())+fileName, fileContent, objectMetadata);
        } catch(Exception ex) {
            logger.error("上传文件异常!");
            throw ex;
        } finally {
            //关闭流文件
            FileUtils.close(fileContent);
        }
    }

    /**
     * 从OSS上获取下载流,并转成String格式输出
     * @param bucketName
     * @param detail
     * @param ossPath
     * @return
     */
    public String downloadString(String bucketName, String detail, String ossPath) throws IOException {
        OSSObject ossObject = null;
        InputStream inputStream = null;
        String key =  ossPath + detail;
        //去掉前面的"/"
        key = key.substring(1, key.length());
        //从oss上获取流
        try {
            ossObject = getOSSClient().getObject(BUCKET_NAME, key);
            inputStream = ossObject.getObjectContent();
            byte[] bytes = IOUtils.readStreamAsByteArray(inputStream);
            //byte[]转String,编码
            String stringDetail = new String(bytes, "UTF-8");
            detail = stringDetail;
        } catch (IOException e) {
            logger.error("oss下载文件异常!");
            e.printStackTrace();
        } finally {
            //关闭流文件
            FileUtils.close(inputStream);
        }
        return detail;
    }


    public void downloadImage(String bucketName, String imageSrcPath, String fileName, String ossPath)
            throws IOException {

        OSSObject ossObject = null;
        InputStream inputStream = null;
        FileOutputStream output = null;
        String key = ossPath + fileName;
        key = key.substring(1, key.length());
        //从OSS上获取文件
        try {
            ossObject = getOSSClient().getObject(bucketName, key);
            inputStream = ossObject.getObjectContent();
            byte[] bytes = IOUtils.readStreamAsByteArray(inputStream);

            //创建目录和文件
            File fileOss = new File(imageSrcPath);
            if((!fileOss.isDirectory())) {
                fileOss.mkdirs();
            }
            //fileName为1122.png.20160628201838,去掉后缀20160628201838
            fileName = fileName.substring(0, fileName.lastIndexOf("."));
            output = new FileOutputStream(imageSrcPath + fileName);
            output.write(bytes);
        } catch (IOException e) {
            logger.error("oss下载文件异常!");
            e.printStackTrace();
        } finally {
            //关闭流文件

            FileUtils.close(output);
            FileUtils.close(inputStream);
        }
    }

    public String getBucketName() {
        return BUCKET_NAME;
    }
    @Value("${BUCKET_NAME}")
    public void setBucketName(String bucketName) {
        BUCKET_NAME = bucketName;
    }

    public String getAccessKeySecret() {
        return ACCESS_KEY_SECRET;
    }
    @Value("${ACCESS_KEY_SECRET}")
    public void setAccessKeySecret(String accessKeySecret) {
        ACCESS_KEY_SECRET = accessKeySecret;
    }

    public String getAccessKeyId() {
        return ACCESS_KEY_ID;
    }
    @Value("${ACCESS_KEY_ID}")
    public void setAccessKeyId(String accessKeyId) {
        ACCESS_KEY_ID = accessKeyId;
    }

    public String getEndPoint() {
        return END_POINT;
    }
    @Value("${END_POINT}")
    public void setEndPoint(String endPoint) {
        END_POINT = endPoint;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值