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

本文介绍如何利用阿里云OSS服务进行图片上传,并实现外网访问。具体步骤包括配置AccessKeyId等信息、创建Maven项目、实现图片上传与访问路径拼接等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

前提工作:

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

准备好

endpoint。 在下图可以找到

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

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

正式开始

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

controller接受请求

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

 

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

所以来看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<String, Object> data = new HashMap<String, Object>();
        data.put("image_src", url);
        return new ImgMessage("success", data);
    }

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

ImgMessage


public class ImgMessage {
    private String status;
    private Map<String,Object> data;

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

    public ImgMessage() {
    }

    public String getStatus() {
        return status;
    }

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

    public Map<String, Object> getData() {
        return data;
    }

    public void setData(Map<String, Object> 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<String> bucketUrls) {
        OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
        try {
            // 删除Object.
            DeleteObjectsResult deleteObjectsResult = client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(bucketUrls));
            List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            client.shutdown();
        }
        return true;
    }
}

部署到本地服务器上

接下来就是测试

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

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

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

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

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

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

大功告成!

 

 

### Java 使用阿里云 OSS 删除对象 为了实现通过Java代码调用阿里云OSS服务来删除指定的对象,可以利用`com.aliyun.oss.OSSClient`类提供的API方法。下面是一个简单的例子展示如何完成这一操作: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; public class OssDeleteObject { public static void main(String[] args) { // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<your-access-key-id>"; String accessKeySecret = "<your-access-key-secret>"; String bucketName = "examplebucket"; // 替换为用户的实际存储空间名称 String objectName = "exampleobject"; // 要删除的目标文件名 // 创建OSSClient实例。 try (OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret)) { // 删除单个文件 ossClient.deleteObject(bucketName, objectName); System.out.println("删除成功"); } catch (Exception e) { System.err.println(e.getMessage()); } } } ``` 此段代码展示了基本流程:初始化客户端、执行删除命令以及处理异常情况[^1]。 对于批量删除多个对象的情况,则可以通过提供一个包含待删对象键列表的方式来简化操作过程。需要注意的是,在真实环境中应当妥善保管自己的密钥信息,并遵循最小权限原则分配必要的访问控制策略给相应的应用程序服务账户。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值