package com.fzm.mall.server.admin.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * @author wangp
 * @description 阿里云OSS对象存储--简单上传
 * @date 2020/8/19 17:30
 */
public class OSSUtil {

    // Endpoint以杭州为例，其它Region请按实际情况填写。
    private static final String endpoint = "https://oss-cn-shanghai.aliyuncs.com";

    // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
    private static final String accessKeyId = "LTAI5tD9SPnwKjaAzywQEvde";
    private static final String accessKeySecret = "Mm1R0sVS10IrRBsNIEvJpLQRj4tOjj";

    // 存储空间
    private static final String bucketName = "hlg-data";

    // OSS基础访问地址
    private static final String baseUrl = "https://hlg-data.oss-cn-shanghai.aliyuncs.com/";

    // 创建OSSClient实例
    public static OSS getOssClient() {
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }

    /**
     * 上传字符串
     *
     * @param content  待上字符串
     * @param folder   OSS文件夹名
     * @param fileName OSS文件名
     * @return OSS访问地址
     */
    public static String uploadString(String content, String folder, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();

        // 创建PutObjectRequest对象。
        // <yourObjectName>表示上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, folder + fileName,
                new ByteArrayInputStream(content.getBytes()));

        // 如果需要上传时设置存储类型与访问权限，请参考以下示例代码。
        // ObjectMetadata metadata = new ObjectMetadata();
        // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        // metadata.setObjectAcl(CannedAccessControlList.Private);
        // putObjectRequest.setMetadata(metadata);

        // 上传字符串。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();

        return baseUrl + folder + fileName;
    }

    /**
     * 上传Byte数组
     *
     * @param content  待上传字节数组
     * @param folder   OSS文件夹名
     * @param fileName OSS文件名
     * @return OSS访问地址
     */
    public static String uploadByte(byte[] content, String folder, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();

        // 上传Byte数组。
        ossClient.putObject(bucketName, folder + fileName, new ByteArrayInputStream(content));

        // 关闭OSSClient。
        ossClient.shutdown();

        return baseUrl + folder + fileName;
    }

    /**
     * 上传网络流
     *
     * @param spec     网络地址
     * @param folder   OSS文件夹名
     * @param fileName OSS文件名
     * @return OSS访问地址
     */
    public static String uploadNet(String spec, String folder, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();

        // 上传网络流。
        InputStream inputStream = null;
        try {
            inputStream = new URL(spec).openStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        ossClient.putObject(bucketName, folder + fileName, inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();

        return baseUrl + folder + fileName;
    }

    /**
     * 上传文件流
     *
     * @param in       待上传文件流
     * @param folder   OSS文件夹名
     * @param fileName OSS文件名
     * @return OSS访问地址
     */
    public static String uploadStream(InputStream in, String folder, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();

        // 上传文件流。
        ossClient.putObject(bucketName, folder + fileName, in);

        // 关闭OSSClient。
        ossClient.shutdown();

        return baseUrl + folder + fileName;
    }

    /**
     * 文件上传
     *
     * @param filePath 待上传文件路径
     * @param folder   OSS文件夹名
     * @param fileName OSS文件名
     * @return OSS访问地址
     */
    public static String uploadFile(String filePath, String folder, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();

        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, folder + fileName, new File(filePath));

        // 如果需要上传时设置存储类型与访问权限，请参考以下示例代码。
        // ObjectMetadata metadata = new ObjectMetadata();
        // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        // metadata.setObjectAcl(CannedAccessControlList.Private);
        // putObjectRequest.setMetadata(metadata);

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();

        return baseUrl + folder + fileName;
    }

    public static void main(String[] args) {
        String S = uploadFile("C:\\Users\\bl\\Desktop\\a.png", "manage/img/ttt", "a.png");
        System.err.println(S);
    }


}
