阿里云OSS文件上传存储和删除,获取文件外网访问路径

因为项目中需要存储的数据主要是图片数据,所以使用阿里云提供的OSS存储,性价比高,也很简便。(本文一步一步操作指导最后成功都有截图)

前提工作:

已经在oss创建了bucket,就是一个项目的意思。并且设置公共读,maven依赖搜索aliyun oss第一个添加到pom

准备好

endpoint。 在下图可以找到

accessKeyId 和accessKeySecret ,建议创建一个子账号,提供的id和secret比较安全,泄露了不会对服务器造成大的破坏。

先准备一张图片,等待上传。

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第1张图片

正式开始

创建一个工程:这里有新maven工程文章

controller接受请求

@RequestMapping("uploadImg")
    @ResponseBody
    public ImgMessage uploadImg(@RequestParam(value = "file", required = false) MultipartFile imgFile){
        return testService.saveImg(imgFile);
    }

 

想要获得外网访问地址,阿里云是这么说的

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第2张图片

所以来看service,拼接一下字符串返回就好了

public ImgMessage saveImg(MultipartFile file) {

        // 创建新实例
        AliOssClient client = new AliOssClient();
        // 连接需要的信息
        client.setAccessKeyId("你的AccessKeyId");
        client.setAccessKeySecret("你的AccessKeySecret");
        client.setEndpoint("你的Endpoint");

        // 返回的文件访问路径
        String url = "";

        try {

            //获取文件的原始名字
            String originalfileName = file.getOriginalFilename();
            // 按日期存储
            //String fileAddress = new Date().toString();
            //重新命名文件
            String suffix = originalfileName.substring(originalfileName.lastIndexOf(".") + 1);
            String fileName = new Date().getTime() + "-img." + suffix;

            // 获得文件流
            InputStream inputStream = file.getInputStream();

            // 上传到OSS
            client.putObject("你的BucketName", "自定义路径/" + fileName, inputStream);

            url += "http://你的BucketName.你的Endpoint/自定义路径/" + fileName;
            System.out.println("下载url是:" + url);


        } catch (IOException e) {
            e.printStackTrace();
        }

        // 是否有可访问的地址
        if (url.length() < 2) {
            return new ImgMessage("fail", null);
        }
        HashMap data = new HashMap();
        data.put("image_src", url);
        return new ImgMessage("success", data);
    }

然后是用到的自定义消息和封装好的阿里云OSS操作类

ImgMessage


public class ImgMessage {
    private String status;
    private Map data;

    public ImgMessage(String status, Map data) {
        this.status = status;
        this.data = data;
    }

    public ImgMessage() {
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Map getData() {
        return data;
    }

    public void setData(Map data) {
        this.data = data;
    }
}
AliOssClient
public class AliOssClient {
    private static final Logger LOGGER = LoggerFactory.getLogger(AliOssClient.class);

    private String accessKeyId;
    private String accessKeySecret;
    private String endpoint;

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }

    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    /**
     * 上传某个Object
     *
     * @param bucketName
     * @param bucketUrl
     * @param inputStream
     * @return
     */
    public boolean putObject(String bucketName, String bucketUrl, InputStream inputStream) {
        OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
        try {
            // 上传Object.
            client.putObject(bucketName, bucketUrl, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            client.shutdown();
        }
        return true;
    }

    /**
     * 删除某个Object
     *
     * @param bucketName
     * @param bucketUrl
     * @return
     */
    public boolean deleteObject(String bucketName, String bucketUrl) {
        OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
        try {
            // 删除Object.
            client.deleteObject(bucketName, bucketUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            client.shutdown();
        }
        return true;
    }

    /**
     * 删除多个Object
     *
     * @param bucketName
     * @param bucketUrls
     * @return
     */
    public boolean deleteObjects(String bucketName, List bucketUrls) {
        OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
        try {
            // 删除Object.
            DeleteObjectsResult deleteObjectsResult = client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(bucketUrls));
            List deletedObjects = deleteObjectsResult.getDeletedObjects();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            client.shutdown();
        }
        return true;
    }
}

部署到本地服务器上

接下来就是测试

打开OSS控制台,可以看到文件为空

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第3张图片

打开postman或者自己写一个前端页面上传图片,推荐postman开发测试好工具。

输入本地服务器访问路径,选择要上传的文件

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第4张图片

点击Send按钮,看到本地服务器返回了上传成功之后的外网访问地址。

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第5张图片

再看一下oss文件有没有更新

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第6张图片

出现了新文件,最后用返回的地址访问一下 ,看是否是我们上传的图片

阿里云OSS文件上传存储和删除,获取文件外网访问路径_第7张图片

大功告成!

 

 

你可能感兴趣的:(阿里云)