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 "删除成功!";
    }
发布了67 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37635053/article/details/104955228