记录华为OBS文件上传下载多种方式

公司要从阿里的oss切换到华为的obs,为了尽量小代价的改动,所以想找和阿里一样上传的方式,之前阿里做的是后端生成文件上传的url,前端做上传动作,这里记录一下obs的多种上传方式。直接上代码:

1、获取OBS配置

引入maven

    <dependency>
        <groupId>com.huaweicloud</groupId>
        <artifactId>esdk-obs-java</artifactId>
        <version>3.21.11</version>
    </dependency>

其中的各种配置自己在华为平台找到哦。

import com.obs.services.ObsClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ObsConfig {
    @Value("${huawei.obs.ak:xxxx}")
    private String ak;

    @Value("${huawei.obs.sk:xxxxxxxxx}")
    private String sk;

    @Value("${huawei.obs.upload.endPoint:xxx.xxx.com}")
    private String endPoint;

    @Bean
    public ObsClient getObsClient(){
        return new ObsClient(ak, sk, endPoint);
    }
}

这里是工具类代码:

import com.alibaba.fastjson.JSON;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

@Component
public class ObsUtils {

    private static ObsClient obsClient;

    private static String bucketName;

    private static String parentDir;

    //静态属性注入
    @Autowired
    public void setObsClient(ObsClient obsClient) {
        ObsUtils.obsClient = obsClient;
    }

    @Value("${huawei.obs.bucketName}")
    public void setBucketName(String bucketName) {
        ObsUtils.bucketName = bucketName;
    }

    @Value("${huawei.obs.parentDir}")
    public void setParentDir(String parentDir) {
        ObsUtils.parentDir = parentDir;
    }

    /**
     * 生成文件上传url
     *
     * @param contentType 文件类型
     * @param objectKey     文件名,如果桶中有文件夹的话,如往test文件上传test.txt文件,那么objectKey就是test/test.txt
     */
    public static String getUploadFileUrl(String  contentType, String objectKey) {
        TemporarySignatureRequest signatureRequest=new TemporarySignatureRequest(HttpMethodEnum.PUT,1800);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", contentType);
        signatureRequest.setBucketName(bucketName);
        signatureRequest.setObjectKey(objectKey);
        signatureRequest.setHeaders(headers);
        TemporarySignatureResponse temporarySignature = obsClient.createTemporarySignature(signatureRequest);
        return temporarySignature.getSignedUrl();
    }
    /**
     * 断点续传
     * @param fileUrl        设置待上传的本地文件,fileUrl为待上传的本地文件路径,需要指定到具体的文件名
     * @param objectKey     文件名,如果桶中有文件夹的话,如往test文件上传test.txt文件,那么objectKey就是test/test.txt
     */
    public static CompleteMultipartUploadResult uploadFileRequest(String fileUrl,String objectKey){

        UploadFileRequest request = new UploadFileRequest(bucketName, objectKey);
        // 设置待上传的本地文件,fileUrl为待上传的本地文件路径,需要指定到具体的文件名
        request.setUploadFile(fileUrl);
        // 设置分段上传时的最大并发数
        request.setTaskNum(5);
        // 设置分段大小为10MB
        request.setPartSize(10 * 1024 * 1024);
        // 开启断点续传模式
        request.setEnableCheckpoint(true);
        try{
            // 进行断点续传上传
           return obsClient.uploadFile(request);
        }catch (ObsException e) {
           return uploadFileRequest(fileUrl,objectKey);
        }
    }
    /**
     * 上传文件
     *
     * @param multipartFile 文件
     * @param objectKey     文件名,如果桶中有文件夹的话,如往test文件上传test.txt文件,那么objectKey就是test/test.txt
     * @throws Exception
     */
    public static PutObjectResult uploadFile(MultipartFile multipartFile, String objectKey) throws Exception {
        InputStream inputStream = multipartFile.getInputStream();
        PutObjectResult putObjectResult = obsClient.putObject(bucketName, parentDir + "/" + objectKey, inputStream);
        inputStream.close();
        return putObjectResult;
    }

    /**
     * 上传文件
     *
     * @param file      文件
     * @param objectKey 文件名,如果桶中有文件夹的话,如往test文件上传test.txt文件,那么objectKey就是test/test.txt
     * @throws Exception
     */
    public static PutObjectResult uploadFileByFile(File file, String objectKey) throws Exception {
        InputStream inputStream = new FileInputStream(file);
        PutObjectResult putObjectResult = obsClient.putObject(bucketName, parentDir + "/" + objectKey, inputStream);
        PostSignatureRequest res = new PostSignatureRequest();
        PostSignatureResponse postSignature = obsClient.createPostSignature(res);
        inputStream.close();
        return putObjectResult;
    }


    /**
     * 文件下载
     *
     * @param objectKey 文件名
     * @return
     */
    public static ObsObject downFile(String objectKey) {
        ObsObject obsObject = obsClient.getObject(bucketName, parentDir + "/" + objectKey);
        return obsObject;
    }

    /**
     * 文件下载
     *
     * @param bucketName 桶
     * @param objectKey  文件名
     * @return
     */
    public static ObsObject downFile(String bucketName, String objectKey) {
        ObsObject obsObject = obsClient.getObject(bucketName, objectKey);
        return obsObject;
    }

    /**
     * 删除文件
     *
     * @param objectKey 文件名,如果桶中有文件夹的话,如往test文件上传test.txt文件,那么objectKey就是test/test.txt
     * @throws Exception
     */
    public static DeleteObjectResult deleteFile(String objectKey) throws Exception {
        DeleteObjectResult deleteObjectResult = obsClient.deleteObject(bucketName, objectKey);
        return deleteObjectResult;
    }
    //测试
    public static void main(String[] args) {
        String endPoint ="xxxx.com";
        String ak = "xxxxx";
        String sk = "xxxxx";

        // 创建ObsClient实例
        final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
        TemporarySignatureRequest sss=new TemporarySignatureRequest(HttpMethodEnum.PUT,3600);
        Map<String, String> headers = new HashMap<>();
        String contentType = "text/plain";
        headers.put("Content-Type", contentType);
        sss.setBucketName("test");
        sss.setObjectKey("test");
        sss.setHeaders(headers);
        TemporarySignatureResponse temporarySignature = obsClient.createTemporarySignature(sss);
        // 获取表单上传请求参数
        System.out.println("\t" + temporarySignature.getSignedUrl());
        System.out.println("\t" + JSON.toJSONString(temporarySignature));
    }
}

各位自取,最佳的实现方式应该是使用生成文件上传url方式,前端直接上传文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值