javaweb接入阿里oss

【01】什么是阿里云 ?

这是阿里云的官网:https://www.aliyun.com

(1.1)打开官网之后,就是这个样子的。

【2】什么是阿里云OSS ?

(2.2)下面红框是阿里云OSS的一个简介,简而言之,他就是一个文件存储的服务。

比如你的网站开发,假设需要用到图片上传,文件上传等功能。

以前我们的做法是,自己搭建一个图片服务器或者文件服务器,然后自己在写一套相关的实现方法。

但现在我们如果用了阿里云的OSS的话,这一块儿就可以省去我们买服务器的钱和写代码实现的时间。

【3】注册与登录

既然要使用人家的功能,总不能白白使用,肯定是需要一个账号付费的,左边登录,右边注册,自己看着办。

有账号的点登录,没账号的先注册一个,然后登录。已经登录的就当我没说。

【4】开通OSS

(4.1)登录成功后,如果没有开通OSS的,则点击【立即开通】,然后他会提示相关方案。

开通的过程中他会让你选择个人版还是企业版,后面的API接口都一样,自己根据业务需要开通过即可。

(4.2)如果已经开通,则可以看到【管理控制台】

【5】创建 Bucket

Bucket 的中文意思是桶,桶是用来干嘛的?当然是装东西的。也就是官方说的存储空间。

你可以理解为你电脑中的C盘、D盘、E盘等。

(5.2)创建Bucket的时候,会让你填写相关信息,一般来说我们只填名称和选择区域,其他都默认就好。

Bucket名称是唯一的,这个唯一同其他所有用户,比如sunny这个桶已经有人用了,那么你就不能用这个了。至于是谁用的,你不知道,我也不知道。

区域就是你想把你东西存放到哪个地方,从功能来说,选哪个都一样。

选择完毕后,点击【确定】完成创建。

【6】记住桶名(bucketName)和 外网地域节点(endPoint)

(6.1)完成创建后,就可以看到这个存储空间 sunnyzyq 了,右边是空间的相关介绍。记住这个桶名 (bucketName),等会撸代码的时候需要。

(6.2)另外,还有记住你的这个Endpoint,等会撸代码的时候也需要。

【7】创建AccessKey,获取授权信息

阿里云的OSS只是一个服务,我们要使用服务,需要 AccessId 和 AccessKey 进行授权。不光是阿里接口,几乎所有API接口都有这一步。

如果找不到创建AccessKey的入口可以搜索一下

点击【创建AccessKey】。

然后他会向你发验证码,确认是否是本人操作,输入验证码后,就会得到相关的的 AccessKeyId 和 AccessKeySecret 了。

【8】确保余额充足

现在万事俱备,只差充值。阿里不可能让你白玩的,多冲少冲,多少要冲,我们往账户冲点钱,多少由你自己决定。

【9】阿里云OSS实战

空间现在有了,金额有了,授权有了,我们就可以实际操作一把了。

OSS具体开发文档链接地址为:https://help.aliyun.com/product/31815.html

例如:我们往上面上传一张图片。以下为复制别的地方的内容

打开项目,在pom.xm中引入oss关联的依赖

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

创建包 com.aliyu.oss,包下创建类 AliyunOssUntil.java

我们去百度找一张漂亮小姐姐的图片,保存到桌面。

然后把她拷贝到项目中,放在最外层根目录里。

然后我们就开始进入最关键的撸代码部分了。

我们给上传的图片重新取个名字,叫为: zhaoliying.jpg 。


package com.aliyun.oss;
 
import java.io.File;
 
public class AliyunOssUntil {
	
	public static final String endpoint = "你的endpoint";
	public static final String accessKeyId = "你的accessKeyId";
	public static final String accessKeySecret = "你的accessKeySecret";
	public static final String bucketName = "你的桶名";
 
	public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
	
	public static void main(String[] args) {
		ossClient.putObject(bucketName, "zhaoliying.jpg", new File("zly.png"));
		ossClient.shutdown();
		System.out.println("上传图片完成!");
	}
 
}

OK,代码撸好了,我们执行下。控制台显示了,说明程序已经执行完毕。再去看下控制面板里是否已经成功上传

总结:OK,阿里云的 OSS 如何使用已经介绍完成了,虽然只举了一个例子,但整个流程已经打通完毕。

上传后遇到的问题:

You have no right to access this object because of bucket acl.

这是使用阿里云OSS上传文件服务时报的错,这是由于新建的子用户AccessKey没有配置相应的权限所导致的。

解决方法,配置上相应权限。

找到相关子用户,添加权限:

在这里插入图片描述
在这里插入图片描述
添加上权限后即可正常上传文件了。

集成到springboot项目中

4.1 阿里云OSS配置

在resource下新建一个application-oss.properties

aliyun.endpoint=oss-cn-shanghai.aliyuncs.com

aliyun.accessKeyId=你的accessKeyId

aliyun.accessKeySecret=你的accessKeySecret

aliyun.bucketName=gaojun-testbucket

aliyun.urlPrefix=http://gaojun-testbucket.oss-cn-shanghai.aliyuncs.com/

spring.servlet.multipart.max-file-size=100MB

spring.servlet.multipart.max-request-size=1000MB

在java的包下新建一个config包,创建一个AliyunConfig.java

package com.evaluation.tcvl.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;


@Configuration
@PropertySource(value = {"classpath:application-oss.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String urlPrefix;

    @Bean
    public OSS oSSClient() {
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

4.2 后端业务

4.2.1 vo

该实体类用于后台返回给前台

package com.evaluation.tcvl.pojo.vo;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class FileUploadResult {
    // 文件唯一标识
    private String uid;
    // 文件名
    private String name;
    // 状态有:uploading done error removed
    private String status;
    // 服务端响应内容,如:'{"status": "success"}'
    private String response;
    //返回的有用数据
    private Map<String,Object> data = new HashMap<>();
}

4.2.2 service

在service使用ossClient操作阿里云OSS,进行上传、下载、删除、查看所有文件等操作,同时可以将图片的url进行入库操作。

package com.evaluation.tcvl.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONObject;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.evaluation.common.result.Re;
import com.evaluation.tcvl.config.AliyunConfig;
import com.evaluation.tcvl.pojo.vo.FileUploadResult;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class FileUploadService {
    // 允许上传的格式
//    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"};

    @Autowired
    private OSS ossClient;

    @Autowired
    private AliyunConfig aliyunConfig;

    /**
     * 文件上传
     * @param uploadFile
     * @return
     */
    public Re upload(MultipartFile uploadFile) {
        // 校验图片格式
//        boolean isLegal = false;
//        for (String type : IMAGE_TYPE) {
//            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),
//                    type)) {
//                isLegal = true;
//                break;
//            }
//        }
        //封装Result对象,并且将文件的byte数组放置到result对象中
//        FileUploadResult fileUploadResult = new FileUploadResult();
//        if (!isLegal) {
//            fileUploadResult.setStatus("error");
//            return fileUploadResult;
//        }
        //文件新路径
        String fileName = uploadFile.getOriginalFilename();
        String filePath = getFilePath(fileName);
        // 上传到阿里云
        try {
            ossClient.putObject(aliyunConfig.getBucketName(), filePath, new
                    ByteArrayInputStream(uploadFile.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
//            fileUploadResult.setStatus("error");
//            return fileUploadResult;
            Re.error().message("上传失败");
        }

//        fileUploadResult.setStatus("done");
//        fileUploadResult.setResponse("success");
        //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保存到数据库
        Map<String,Object> map = new HashMap<>();
        map.put("url",this.aliyunConfig.getUrlPrefix() + filePath);
        map.put("name",fileName);
//        map.put("uid",String.valueOf(System.currentTimeMillis()));
//        fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);
//        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
//        fileUploadResult.setData(map);
//        return fileUploadResult;
        return Re.ok().data("data",map).message("上传成功");
    }

    /**
     * 生成路径以及文件名
     * @param sourceFileName
     * @return
     */
    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "Store/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" +
                sourceFileName;
        // + "." +
        //                StringUtils.substringAfterLast(sourceFileName, ".")
    }

    /**
     * 查看文件列表
     * @return
     */
    public List<OSSObjectSummary> list() {
        // 设置最大个数。
        final int maxKeys = 200;
        // 列举文件。
        ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));
        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
        return sums;
    }

    /**
     * 删除文件
     * @param objectName
     * @return
     */
    public Re delete(String objectName) {
        // 根据BucketName,objectName删除文件
        ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);
//        FileUploadResult fileUploadResult = new FileUploadResult();
//        fileUploadResult.setName(objectName);
//        fileUploadResult.setStatus("removed");
//        fileUploadResult.setResponse("success");
//        return fileUploadResult;
        return Re.ok().data("data",objectName).message("删除成功");
    }

    /**
     * 下载文件
     * @param os
     * @param objectName
     * @throws IOException
     */
    public void exportOssFile(OutputStream os, String objectName) throws IOException {
        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(aliyunConfig.getBucketName(), objectName);
        // 读取文件内容。
        BufferedInputStream in = new BufferedInputStream(ossObject.getObjectContent());
        BufferedOutputStream out = new BufferedOutputStream(os);
        byte[] buffer = new byte[1024];
        int lenght = 0;
        while ((lenght = in.read(buffer)) != -1) {
            out.write(buffer, 0, lenght);
        }
        if (out != null) {
            out.flush();
            out.close();
        }
        if (in != null) {
            in.close();
        }
    }

}

4.2.3 controller

controller进行接收用户请求

package com.evaluation.tcvl.controller;

import com.aliyun.oss.model.OSSObjectSummary;
import com.evaluation.common.result.Re;
import com.evaluation.tcvl.pojo.vo.FileUploadResult;
import com.evaluation.tcvl.service.impl.FileUploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/file")
@Api(tags = "阿里oss接口")
public class FileUploadController {

    @Autowired
    private FileUploadService fileUploadService;

    @PostMapping("/upload")
    @ApiOperation(value = "文件上传到oss")
    @ResponseBody
    public Re upload(@RequestParam("file") MultipartFile uploadFile)
            throws Exception {
        return this.fileUploadService.upload(uploadFile);
    }

    @PostMapping("/delete")
    @ApiOperation(value = "根据文件名删除oss上的文件")
    @ResponseBody
    public Re delete(@RequestParam("fileName") String objectName)
            throws Exception {
        return this.fileUploadService.delete(objectName);
    }

    @GetMapping("/list")
    @ApiOperation(value = "查询oss上的所有文件")
    @ResponseBody
    public List<OSSObjectSummary> list()
            throws Exception {
        return this.fileUploadService.list();
    }

    @GetMapping("/download")
    @ApiOperation(value = "根据文件名下载oss上的文件")
    @ResponseBody
    public void download(@RequestParam("fileName") String objectName, HttpServletResponse response) throws IOException {
        //通知浏览器以附件形式下载
        response.setHeader("Content-Disposition",
                "attachment;filename=" + new String(objectName.getBytes(), "ISO-8859-1"));
        this.fileUploadService.exportOssFile(response.getOutputStream(),objectName);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值