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

因为项目中需要存储的数据主要是图片数据,所以使用阿里云提供的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)进行文件上传的功能,可以按照以下方法编写相应的程序。 #### 添加Maven依赖 首先,在项目的`pom.xml`文件中添加阿里云OSS SDK的依赖项: ```xml <!-- 阿里云OSS --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` 此部分配置确保项目能够访问到必要的库来操作OSS[^3]。 #### 创建OSS客户端实例并设置参数 接着定义一个用于连接至OSS的服务类`OssService`,其中包含了初始化Client以及处理文件上传的具体逻辑。这里假设已经获取到了AccessKeyId, AccessKeySecret BucketName等必要信息。 ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; public class OssService { private static final String ENDPOINT = "your-endpoint"; private static final String ACCESS_KEY_ID = "your-access-key-id"; private static final String ACCESS_KEY_SECRET = "your-access-key-secret"; private static final String BUCKET_NAME = "your-bucket-name"; /** * 使用默认超时时间创建OSSClient. */ public OSS createOssClient() { return new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); } } ``` 这段代码展示了如何构建一个新的OSS Client 实例以便后续的操作[^1]。 #### 定义上传功能 在同一个`OssService`类内继续扩展,加入实际执行上传动作的方法: ```java import org.springframework.web.multipart.MultipartFile; // ... other imports ... public class OssService { // ... previous code ... /** * 将本地文件上传到指定bucket下的特定路径下。 * * @param file 待上传文件 * @return 返回外网访问链接地址 * @throws Exception 如果发生错误则抛出异常 */ public String uploadFile(MultipartFile file) throws Exception{ try (OSS client = this.createOssClient()) { InputStream inputStream = file.getInputStream(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(file.getContentType()); PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, file.getName(), inputStream); // 设置自定义元数据 putObjectRequest.setMetaData(metadata); // 执行上传请求 client.putObject(putObjectRequest); // 获取返回URL Date expirationDate = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365); // URL有效期一年 GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(BUCKET_NAME, file.getName()) .withExpiration(expirationDate); URL url = client.generatePresignedUrl(generatePresignedUrlRequest); return url.toString(); } } } ``` 上述函数接收一个多部件形式提交上来的文件作为输入,并将其保存到预先设定好的Bucket当中;最后会生成该资源对外界公开可用的HTTP(S)链接供外部调用者使用[^2]。 #### 构建控制器接口 为了让前端应用或者其他微服务可以通过RESTful API的形式触发这个过程,还需要设计对应的Controller层来进行路由映射服务调度工作: ```java @RestController @RequestMapping("/upload") public class OssController { @Autowired private OssService ossServiceImpl; @PostMapping("/uploadimg") public ResponseEntity<String> handleUpload(@RequestParam("file") MultipartFile file){ try { String resultUrl = ossServiceImpl.uploadFile(file); return ResponseEntity.ok(resultUrl); } catch (Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } } ``` 以上就是完整的基于Spring Boot框架开发的一个简单的图片上传API案例说明。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值