利用阿里云oss实现上传视频和图片功能

要想使用阿里云,全提是先开通阿里云的功能
在这里插入图片描述
查看oss的配置内容
在这里插入图片描述

先应用oss的依赖

    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
    </dependency>

来一波阿里云工具类

package com.lza.util;
import org.joda.time.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

/**
 * 阿里云客户端
 */

public class AliOSSClientUtil {

    /** 日志 */
    public static Logger logger = LoggerFactory.getLogger(AliOSSClientUtil.class);

    /** 阿里云API的密钥Access Key ID */
    public static String accessKeyId ="你的配置";
    /** 阿里云API的密钥Access Key Secret */
    public static String accessKeySecret="你的配置";
    /** 阿里云API的内或外网域名 */
    public static String endpoint="你的配置";
   public static String bucketName="你的配置";

    /** 阿里云短信签名名称 *//*
    private static String signName = "*****";
    *//** 阿里云短信模板代码 *//*
    private static String templateCode = "*****";
    @Value("{ali.folder}")
    private String folder;*/
    /**
     * 获取阿里云OSS客户端对象
     *
     * @return ossClient
     */
    public static  OSSClient getOSSClient() {
        return new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }

    /**
     * 创建存储空间
     *
     * @param ossClient OSS连接
     * @param bucketName 存储空间
     * @return
     */
    public static String createBucketName(OSSClient ossClient, String bucketName) {
        // 存储空间
        final String bucketNames = bucketName;
        if (!ossClient.doesBucketExist(bucketName)) {
            // 创建存储空间
            Bucket bucket = ossClient.createBucket(bucketName);
            logger.info("创建存储空间成功");
            return bucket.getName();
        }
        return bucketNames;
    }

    /**
     * 删除存储空间buckName
     *
     * @param ossClient oss对象
     * @param bucketName 存储空间
     */
    public static void deleteBucket(OSSClient ossClient, String bucketName) {
        ossClient.deleteBucket(bucketName);
        logger.info("删除" + bucketName + "Bucket成功");
    }

    /**
     * 根据key删除OSS服务器上的文件
     *
     * @param ossClient oss连接
     * @param bucketName 存储空间
     * @param folder 模拟文件夹名
     * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
     */
    public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key) {
        ossClient.deleteObject(bucketName, folder + key);
        logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");
    }

    /**
     * 创建模拟文件夹
     *
     * @param ossClient oss连接
     * @param bucketName 存储空间
     * @param folder 模拟文件夹名如
     * @return 文件夹名
     */
    public static   String createFolder(OSSClient ossClient, String bucketName, String folder) {
        // 文件夹名
        final String keySuffixWithSlash = folder;
        // 判断文件夹是否存在,不存在则创建
        if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {
            // 创建文件夹
            ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
            logger.info("创建文件夹成功");
            // 得到文件夹名
            OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
            String fileDir = object.getKey();
            return fileDir;
        }
        return keySuffixWithSlash;
    }


    /**
     * 上传图片至OSS
     *
     * @param ossClient oss连接
     * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
     * @param bucketName 存储空间
     * @param folder 模拟文件夹名
     * @return String 返回文件url
     */
    public static   String upload(OSSClient ossClient, File file, String bucketName, String folder) {
        String resultStr = null;
        try {
            InputStream is = new FileInputStream(file);
            String fileName = file.getName();
            ossClient.putObject(bucketName, folder + fileName, is);
            resultStr = "http://"+endpoint+"/"+folder+fileName;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
        }
        return resultStr;
    }

    /**
     * 上传图片至OSS
     *
     * @param
     *
     *
     * @return String 返回文件url
     */
    public static   String uploadVideo(MultipartFile file) {
        //上传地址
        String uploadUrl=null;
        System.out.println(bucketName+endpoint+accessKeyId+accessKeySecret);
        try {
            //创建实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            System.out.println("ossClient"+ossClient);
            System.out.println("oss:"+ossClient);
            //判断bucketName是否存在
            if(!ossClient.doesBucketExist(bucketName)){
                //创建bucket
                ossClient.createBucket(bucketName);
                //设置bucket属性
                ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            }
            //获取上传的文件流
            InputStream inputStream=file.getInputStream();
            //构建日期的文件夹路径 avatar/2021/9/12/文件名
            String datePath= new DateTime().toString("yyy/MM/dd");
            //获取上传文件的全名称
            String original = file.getOriginalFilename();
            //获取uuid 随机生成的,每次都不同 9c649622-7b7b-4fca-ba74-daae5ea4b3c8 变为9c6496227b7b4fcaba74daae5ea4b3c8
            String fileName = UUID.randomUUID().toString().replace("-", "");
            //获取文件路径的扩展名 meizi.jpg  就应该是jpg
            String fileType = original.substring(original.lastIndexOf("."));
            //并接文件名称 9c6496227b7b4fcaba74daae5ea4b3c8.jpg
            String newName=fileName+fileType;
            //生成文件夹   avatar/2021/9/12/9c6496227b7b4fcaba74daae5ea4b3c8.jpg
            fileName= datePath+"/"+newName;
            //每次上传的文字都是不能相同的---uuid方法 文件格式:yyyy/MM/dd+uuid

            //要实现图片预览效果,还需要设置
            //1.设置文件的ACL(权限),要么是公共读,要么是公共读写
            //2.一定要设置文本类型(image/jpg)
            ObjectMetadata objectMetadata=new ObjectMetadata();
            //设置公共读权限
            objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
            objectMetadata.setContentType(getContentType(fileType));
            ossClient.putObject(bucketName, fileName, file.getInputStream(),objectMetadata);
            // 关闭OSSClient。
            ossClient.shutdown();
            //默认十年不过期
            Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
            //获取在线访问的url bucket名称  文件名   过期时间
            uploadUrl = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();

        }catch (Exception e){
            e.printStackTrace();
        }
        //返回数据是关键如果你直接返回uploadUrl那么后面就会出现很多参数,所以要进行截取
        System.out.println(uploadUrl);
        return uploadUrl.substring(0,uploadUrl.indexOf("?"));
    }


    /**
     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
     *
     * @param fileName 文件名
     * @return 文件的contentType
     */
    public static String getContentType(String fileName) {
        // 文件的后缀名
        String FilenameExtension = fileName.substring(fileName.lastIndexOf("."));
        if (FilenameExtension.equalsIgnoreCase(".pdf")) {
            return "application/pdf";
        }
        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"))
        {
            return "application/msword";
        }
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            return "text/xml";
        }
        if (FilenameExtension.equalsIgnoreCase(".mp4")) {//MP4格式
            return "video/mp4";
        }
        return "image/jpg";

    }


    /*
    *//**
     * 阿里云短信验证码
     * @return
     *//*
    public static String smsCode(String phone){
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        String smsCode = RandomUtil.randomNumbers(6);
        request.setSysMethod(MethodType.POST);
        request.setSysVersion("2017-05-25");
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", signName);
        request.putQueryParameter("TemplateCode", templateCode);
        request.putQueryParameter("TemplateParam","{code:"+smsCode+"}");
        try {
            CommonResponse response = client.getCommonResponse(request);
            String data = response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return smsCode;
    }*/
}

运行实例,上传一波视频,这个根据你的接口而定,参数是MultipartFile file

 //上传视频
    @PostMapping("uploadVideos")
    @RequiredToken
    public ResponseBean upload(MultipartFile file, Video video, HttpServletRequest request) throws IOException {
        //在请求头中获取user信息
        User user = (User) request.getAttribute("user");
        //获取用户的id
        video.setUid(user.getId());
      /*  //获取分类id
        video.setCategoryId(category_id);*/
        //修改和发布时间
        Date date=new Date();
        video.setCreatedAt(date);
        video.setUpdatedAt(date);
        **//上传阿里云
        String url = AliOSSClientUtil.uploadVideo(file);//静态方法
    //阿里云oss截取视频中某一帧作为封面
        String cover = url + "?x-oss-process=video/snapshot,t_30000,f_jpg,w_0,h_0,m_fast,ar_auto";
//6.设置视频信息
       video.setCover(cover);//设置视频封面
        video.setLink(url);//设置视频地址**
        //video.setCategoryId(category_id);//设置类别id
        System.out.println(video);
        ResponseBean uploadVideo=videosClient.publish(video);
        //boolean save = videoService.save(video);
        return ResponseBean.success("上传视频成功"+uploadVideo);
    }

运行结果
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Typora图床搭建阿里云OSS的步骤如下: 1. 首先,登录阿里云账号并打开OSS控制台。 2. 创建一个新的存储空间(bucket),用于存放Typora上传图片。 3. 在存储空间(bucket)设置中,找到权限管理,确保该存储空间(bucket)的访问权限设置为公共读。 4. 在存储空间(bucket)设置中,找到域名管理,将自定义域名与该存储空间(bucket)关联。 5. 下载并安装PicGo工具,它是一个用于快速上传图片并获取图片URL链接的工具。 6. 打开PicGo工具,配置阿里云OSS作为图床,并输入对应的OSS Access Key ID、Access Key Secret以及Bucket名称等信息。 7. 配置上传路径和命名规则,以便管理和组织上传图片。 8. 保存配置并测试上传一张图片,确保能够成功上传并生成对应的URL链接。 9. 完成以上步骤后,即可在Typora中使用PicGo工具进行图片上传,将图片存储到阿里云OSS,并获取对应的URL链接,用于在Markdown文档中引用图片。 请注意,配置阿里云OSS时需要提供正确的Access Key ID和Access Key Secret,以确保上传图片的权限和安全性。同时,根据个人需求和隐私保护的考虑,可以选择将图片以相对路径的形式复制到md文件的次级目录同名文件夹下,而不是全部上传到图床。 参考资料: markdown的特性决定了其文字与图片是分离的,图片通过引用的方式添加到md中,本文所讲的是利用阿里云OSS搭建Typora图床,但是并不推荐将所有图片上传图床,推荐将图片以相对路径的形式复制到md文件的次级目录同名文件夹下,有利于隐私保护并且方便图片管理,只有在博客或者需要公开md时选择上传图床阿里云对象存储配置。 以上步骤就是使用图床将typora数据进行上传到网络上,将图片上传到图传上,这样不管文章发给谁,只要他有网络,他就可以进行访问,使用阿里云oss的目的也是为了防止图片进行丢失,效率极高,使用到图床,那就需要用上传图传的工具picgo了,使用起来也是非常方便,但是一定要注意配置,一步一步来,不然熬夜肝,就等于浪费时间。 尤其注意点。 而有了选择好图床之后,那就需要上传图片的工具,而大家常用的工具为:PicGo ,PicGo是一个用于快速上传图片并获取图片URL链接的工具,目前支持微博图床、七牛图床、腾讯云、又拍云、GitHub、阿里云、Imgur等图床购买对象存储oss。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用阿里云OSS搭建Typora图床配置](https://blog.csdn.net/qq_29688717/article/details/128740958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Typora+阿里云oss搭建图床](https://blog.csdn.net/weixin_51253120/article/details/131680678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值