阿里云图片上传业务快速上手

阿里云文件上传快速上手

1.创建BUCKET

首先登录阿里云搜索对象储存OSS 进入如下界面:
在这里插入图片描述
点击创建Bucket 根据自身需求创建

在这里插入图片描述
在这里插入图片描述

创建完毕后点击bucket列表即可查看创建的所有bucket

在这里插入图片描述

点击bucket 即可查看并修改bucket 详情,包括Endpoint bucket域名等信息

在这里插入图片描述

点击右上用户头像即可查看ACCESS_KEY的相关信息(注意保密)

在这里插入图片描述

在这里插入图片描述

2.导入依赖

 <!--阿里云文件上传-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.8.0</version>
        </dependency>

3.导入阿里云客户端工具类和文件上传工具类

/**
 * 阿里云OSS工具类
 */
@Component
public class AliOssClient {

    private Logger log = LoggerFactory.getLogger(getClass());

    private static String ACCESS_KEY_ID = "**根据自己的ACCESS_KEY填写**";

    private static String ACCESS_KEY_SECRET = "**根据自己的ACCESS_SECRET填写**";

    private static String BUCKET = "shiu-changgou";

    private static String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";

    private static String CDN_URL = "https://s123.oss-cn-beijing.aliyuncs.com";

    /**
     * 字节方式上传
     */
    public boolean uploadFileByBytes(String path, byte[] content) {
        OSS client = getOSSClient();
        try {
            String filename = getFilename(path);
            if (!"".equals(filename)) {
                String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
                ObjectMetadata metadata = new ObjectMetadata();
                metadata.setContentType(getcontentType(suffix));
                client.putObject(BUCKET, filename, new ByteArrayInputStream(content), metadata);
                client.shutdown();
                return true;
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return false;
    }

    /**
     * 流方式上传
     */
    public String uploadFileByStream(String path, InputStream is, String suffix) {
        OSS client = getOSSClient();
        try {
            if (!suffix.startsWith(".")) {
                suffix = "." + suffix;
            }
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(getcontentType(suffix));
            String fileName = getFilename(path) + suffix;
            PutObjectRequest request = new PutObjectRequest(BUCKET, fileName, is, metadata);
            client.putObject(request);
            client.shutdown();
            return String.format("%s/%s", CDN_URL, fileName);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * 本地文件上传
     */
    public String uploadFileByLocal(String path, String local) {
        OSS client = getOSSClient();
        try {
            File file = new File(local);
            String fileName = file.getName();
            String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(getcontentType(suffix));
            String tempFileName = getFilename(path) + fileName.substring(fileName.indexOf("."));
            PutObjectRequest request = new PutObjectRequest(BUCKET, tempFileName, file, metadata);
            PutObjectResult result = client.putObject(request);
            client.shutdown();
            return String.format("%s/%s", CDN_URL, tempFileName);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * 判断文件是否存在
     */
    public boolean exists(String path) {
        OSS client = getOSSClient();
        String filename = getFilename(path);
        if (!"".equals(filename)) {
            return client.doesObjectExist(BUCKET, path);
        }
        return false;
    }

    private String generateUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    private String getFilename(String path) {
        if (path.startsWith("/")) {
            path = path.substring(1);
        }
        if (path.endsWith("/")) {
            path = path.substring(0, path.length() - 1);
        }
        return String.format("%s/%s%s", path, FileUtil.getAbsolutePath(), generateUUID());
    }

    private OSS getOSSClient() {
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        conf.setSupportCname(true);
        return new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    }

    public String uploadFileByStream2(InputStream is, String suffix) {
        OSS client = getOSSClient();
        try {
            String fileName = generateUUID() + "." + suffix;
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(getcontentType(suffix));
            PutObjectRequest request = new PutObjectRequest(BUCKET, fileName, is, metadata);
            client.putObject(request);
            client.shutdown();
            return String.format("%s/%s", CDN_URL, fileName);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * 获取contentType,避免访问非预览直接下载问题
     * @param FilenameExtension
     * @return
     */
    public static String getcontentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpg";
        }
        if (FilenameExtension.equalsIgnoreCase(".html")) {
            return "text/html";
        }
        if (FilenameExtension.equalsIgnoreCase(".txt")) {
            return "text/plain";
        }
        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
            return "application/vnd.visio";
        }
        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                FilenameExtension.equalsIgnoreCase(".ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (FilenameExtension.equalsIgnoreCase(".docx") ||
                FilenameExtension.equalsIgnoreCase(".doc")) {
            return "application/msword";
        }
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            return "text/xml";
        }
        return "image/jpg";
    }
}

 /**
  * 文件上传工具类
  */
public class FileUtil {
    /**
     * 文件保存后的根路径,自定义 
     */
    public static String FILE_ROOT_PATH = "/";

    // 获得文件扩展名(小写不带.)
    public static String getExtensionType(String str) {
        return !StringUtils.isEmpty(str) && str.lastIndexOf(".") >= 0 ? str.substring(str.lastIndexOf(".") + 1, str.length()).toLowerCase() : null;
    }

    public static String getAbsolutePath() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1;
        int day = cal.get(Calendar.DATE);
        return year + "/" + month + "/" + day + "/";
    }
}

4.测试文件上传

@PostMapping(value = "/upLoad")
    public Result upLoadHeadPicture(HttpServletRequest request) {
        if (request instanceof MultipartHttpServletRequest) {
            try {
                MultipartFile multipartFile = ((MultipartHttpServletRequest) request).getFile("pic");
                assert multipartFile != null;
                String name = multipartFile.getOriginalFilename();
                assert name != null;
                String suffix = name.substring(name.lastIndexOf(".")).toLowerCase();
                String picUrl = "";
                if (!".jpg".equals(suffix) && !".png".equals(suffix)) {
                    throw new RuntimeException("头像格式不合法!");
                }
                picUrl = aliOssClient.uploadFileByStream(Constants.HEAD_PIC, multipartFile.getInputStream(), suffix);
                return new Result(true, StatusCode.OK, "头像上传成功", picUrl);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
                throw new RuntimeException("上传头像失败");
            }
        }
        return new Result(false, StatusCode.ERROR, "头像上传失败");
    }

5.Postman 测试

请求地址及传参:

在这里插入图片描述

正确响应:

在这里插入图片描述

访问图片连接效果:

在这里插入图片描述

阿里云查看图片位置:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值