OSS服务器存储图片使用心得

据我所知,图片存储并且可以返回图片路径,显示到前端的方法:

1.fastDFS + nginx的使用,前面博客有讲述,不再赘述。
2.上传本地服务器(file.transferTo(dest)),存在缺陷,例如项目肥大。不讲述。
3.今天的主题讲解使用阿里云的OSS服务器存取图片。

阿里云存储好用。
首先去阿里云(https://www.aliyun.com/?utm_content=se_1003074876)注册账号,并开通OSS,创建bucket、区域选最近的、自己玩就选低频访问、版本控制不开通、公共读,其他不需要。
创建完成后就会获得accessKeyId、accessKeySecret,
获取bucketName:打开bucket列表:Bucket 名称,就是
EndPoint(地域节点),点击bucketName进去就看得到
都是千年狐狸,就不再申请账号这里赘述了。
开始写!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1.把上述的属性配置到yml里面:

spring:
  oss:
    accessKeyId: xxxxxx
    accessKeySecret: xxxxxx
    bucketName:xxxxxx-sso
    endpoint: oss-cn-chengdu.aliyuncs.com
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 1000MB

2.引入属性到代码里

@Value("${spring.oss.accessKeyId}")
    private String accessKeyId;
    @Value("${spring.oss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${spring.oss.bucketName}")
    private String bucketName;
    @Value("${spring.oss.endpoint}")
    private String endpoint;
上传
@RequestMapping("/upload")
    public String upload(MultipartFile multpartFile) {
   		 //创建了bucket下的目录这里指定上传到哪个目录下
        String path = "liaochao/2020-03016/";
        // 创建OSSClient的实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        if (ossClient.doesBucketExist(bucketName)) {
            System.out.println("您已经创建Bucket:" + bucketName + "。");
        } else {
            System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
            // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            ossClient.createBucket(bucketName);
        }
        String fileName = null;
        if (multpartFile.getSize() != 0 && !"".equalsIgnoreCase(multpartFile.getName())) {
            ObjectMetadata om = new ObjectMetadata();
            om.setContentLength(multpartFile.getSize());
            //设置上传到服务器的名称
            fileName = path + multpartFile.getOriginalFilename().toLowerCase();
            System.out.println("我是objectName==========================" + fileName);
            om.addUserMetadata("filename", fileName);
            try {
                ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(multpartFile.getBytes()), om);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (null != ossClient) {
                    ossClient.shutdown();
                }
            }
        }
        //设置文件的有效时间
        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
        String url = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
        return url;
    }
下载

这里有坑:OSSObject ossObject = ossClient.getObject(bucketName, fileName);里面的fileName是文件名称,是上面返回的完整路径中的aliyuncs.com/后面的知道?前面的那串!!!
如果是清楚可以点开阿里云上的图片,详情,下面的文件名就是这里的fileName,,,上传成功往数据库写文件名,注意截取!!
给前端展示的话返回:http://liaochao-sso.oss-cn-chengdu.aliyuncs.com/liaochao/2020-03016/xxx.jpg
就可以展示,不需要问号? 后面的东西

@GetMapping("/download")
    public void download(String fileName, HttpServletResponse response) throws Exception {
        if (null == fileName) {
            log.info("文件名不能为空!");
            return;
        }
        BufferedOutputStream out = null;
        BufferedInputStream in = null;
        OSS ossClient = null;
        try {
            out = new BufferedOutputStream(response.getOutputStream());
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // <yourObjectName>表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg
            //liaochao/2020-03016/203fb80e7bec54e78d4aeaebb9389b504ec26aa5.jpg
            OSSObject ossObject = ossClient.getObject(bucketName, fileName);
            in = new BufferedInputStream(ossObject.getObjectContent());
            response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes(), "iso-8859-1"));
            byte[] buffer = new byte[in.available()];
            int L = 0;
            while ((L = in.read(buffer)) != -1) {
                out.write(buffer, 0, L);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
            if (null != ossClient) {
                ossClient.shutdown();
            }
        }
    }
删除

fileName与删除那里一样是.com后面与?之间的部分

@RequestMapping("/delete")
    public String delete(String fileName) {
        log.info("………delete………start……");
        OSS ossClient = null;
        try {
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            ossClient.deleteObject(bucketName, fileName);
        } catch (Exception e) {
            e.printStackTrace();
            return "删除失败!";
        } finally {
            if (null == ossClient) {
                ossClient.shutdown();
            }
        }
        return "删除成功!";
    }

=springcloudAlibaba中的使用==============

①导包

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
        </dependency>

② 配置yml文件

spring:
  datasource:
    username: root
    password: 123456
    url:  jdbc:mysql://192.168.61.147:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    alicloud:
      access-key: LTAI4G6CU6v5W3GKVmxxxxxxx
      secret-key: SZK8XVd54hIF6qGNHsxxxxxxxx
      oss:
        endpoint: http://oss-cn-chengdu.aliyuncs.com

其实只是配置了access-key、secret-key、endpoint 3个参数

③代码,比直接用aliyun-sdk-oss少一点而已

 InputStream inputStream = new FileInputStream("C:\\Users\\Admin\\Desktop\\cc\\新建文件夹\\凉山那些年\\9.jpg");
        //指定文件夹
        String path = "cc/2020-03016/";
        String fileName = path+"9.jpg";
        //cc-sso对用哪一个bucket,若要配置路径在path 里面配置
        ossClient.putObject("cc-sso", fileName, inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();
        System.out.println("success");

是不是简单易懂易用

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用OSS对象存储的云盘网站是一种基于云技术的网站,它通过阿里云的云存储服务OSS存储用户的文件和数据。 首先,OSS对象存储是一种分布式的数据存储服务,具备高可靠、高可用、高扩展性的特点。云盘网站利用OSS提供的存储空间来存储用户上传的文件,可以实现大规模的文件存储和管理,用户可以通过网站上传、下载、删除、分享、修改文件。 其次,使用OSS对象存储可以实现数据的备份和恢复。云盘网站可以将用户上传的文件复制多份存储在不同的地理位置,以防止单点故障和数据丢失。同时,OSS提供的版本控制功能可以记录不同版本的文件,用户可以随时恢复到之前的版本。 此外,云盘网站还可以通过使用OSS图片处理功能为用户提供便利的图片处理服务。利用OSS提供的图片处理接口,可以对用户上传的图片进行缩放、剪裁、旋转、水印等操作,使得用户可以方便地对图片进行编辑和管理。 最后,使用OSS对象存储的云盘网站具有良好的性能和可扩展性。OSS采用CDN加速,通过阿里云的全球节点,将用户请求路由到离用户最近的节点,提高文件的访问速度。同时,OSS可以根据网站的访问量自动扩展存储空间和吞吐量,以满足云盘网站的高并发需求。 综上所述,使用OSS对象存储的云盘网站具有高可靠性、高可用性、高扩展性、版本控制、图片处理等功能,能够为用户提供稳定、安全、高效的文件存储和管理服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神雕大侠mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值