华为obs 三种文件类型上传及获取

本文详细介绍了华为Object Storage Service (OBS) 的三种文件上传方式:object、二进制流和本地文件上传,并提供了上传接口、参数验证和实际调用示例。同时,还阐述了如何获取文件URL,包括接口调用和参数设置。内容涵盖了上传流程、参数验证和文件操作等关键步骤。


前言

提示:这里可以添加本文要记录的大概内容:

本文主要针对 华为 obs 三种文件类型上传,及文件获取,列举简单的示例。
三种问及那类型分别是:object、二进制流、from-data


提示:以下是本篇文章正文内容,下面案例可供参考

一、object 上传

1.参数示例

{
"path":"1_test/qrcode/20220622/202206201054548452.png",
"type":"object",
"bucket":"1-private-test",
"source":1,
"object":"https://img2.baidu.com/it/u=3573340222,719722755&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=784"
}

参数名	必选	类型						说明
path	是	string					图片在obs存储路径(图片key)
object	是	object/base64/path		上传文件参数
type	是	string					存储类别 默认 object:对象 file:二进制流
bucket	是	string					obs 桶名称
source	否	int						路径标识 1 私有 2 公有 (默认私有)

2.接口地址

@PostMapping("/obsBucket/upload")
public ResponseMessage<UploadReturnDTO> upload(@RequestBody @Valid UploadDTO uploadDTO) {
	//上传文件返回结果
    return ResponseMessage.success(uploadResourceRecordService.uploadBucket(uploadDTO));
}

备注:
UploadDTO :接收参数
UploadReturnDTO 返回参数:自己定义
@RequestBody  传参类型:json
@Valid  验证参数 UploadDTO 文件中的参数 

3.参数信息验证文件

package com.hewa.commonservice.obs.dto;

import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;

/**
 * 上传文件请求参数
 */
@Setter
@Getter
public class UploadDTO implements Serializable {

    /**
     * 图片在obs存储路径(图片key)
     */
    @NotBlank
    private String path;

    /**
     * 上传文件参数
     */
    @NotBlank
    private String object;

    /**
     * 存储类别 默认 object:对象 base64:二进制流
     */
    @NotBlank
    private String type;

    /**
     * obs桶名称
     */
    @NotBlank
    private String bucket;

    /**
     * 路径标识 1 私有 2 公有 (默认私有)
     */
    private Integer source;
}

备注:
NotBlank 验证参数不为空

4.调用上传接口

private PutObjectResult uploadPrivateBucket(UploadDTO uploadDTO,HuaweiObsConfig huaweiObsConfig){

	PutObjectResult putObjectResult = null;
	String endPoint = "https://your-endpoint";
	String ak = "*** Provide your Access Key ***";
	String sk = "*** Provide your Secret Key ***";
	// 创建ObsClient实例
	ObsClient obsClient = new ObsClient(ak, sk, endPoint);
	InputStream inputStream = null;
    HttpURLConnection httpURLConnection = null;
    // **重点在这里**
    try {
        URL url = new URL(uploadDTO.getObject());
        httpURLConnection = (HttpURLConnection) url.openConnection();
        // 设置网络连接超时时间
        httpURLConnection.setConnectTimeout(3000);
        // 设置应用程序要从网络连接读取数据
        httpURLConnection.setDoInput(true);
        httpURLConnection.setRequestMethod("GET");
        int responseCode = httpURLConnection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 从服务器返回一个输入流
            inputStream = httpURLConnection.getInputStream();
        } else {
            inputStream = httpURLConnection.getErrorStream();
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    putObjectResult = obsClient.putObject(bucketName, uploadDTO.getPath(), inputStream);
	return putObjectResult;
                
}

备注:
1.content: 就是参数里的object 
2.objectname :就是参数里的path
3.其他的参数自己更换就行了

二、二进制流上传

1.参数示例

代码如下(示例):

{
"path":"1_test/qrcode/20220622/202206201054548452.png",
"type":"file",
"bucket":"1-private-test",
"source":1,
"object":"iVBORw0KGgoAAAANSUhEU ...省略...." //二进制流
}

参数名	必选	类型						说明
path	是	string					图片在obs存储路径(图片key)
object	是	object/base64/path		上传文件参数
type	是	string					存储类别 默认 object:对象 file:二进制流
bucket	是	string					obs 桶名称
source	否	int						路径标识 1 私有 2 公有 (默认私有)

2.接口地址

@PostMapping("/obsBucket/upload")
public ResponseMessage<UploadReturnDTO> upload(@RequestBody @Valid UploadDTO uploadDTO) {
	//上传文件返回结果
    return ResponseMessage.success(uploadResourceRecordService.uploadBucket(uploadDTO));
}

备注:
UploadDTO :接收参数
UploadReturnDTO 返回参数:自己定义
@RequestBody  传参类型:json
@Valid  验证参数 UploadDTO 文件中的参数 

3.参数信息验证文件

package com.hewa.commonservice.obs.dto;

import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;

/**
 * 上传文件请求参数
 */
@Setter
@Getter
public class UploadDTO implements Serializable {

    /**
     * 图片在obs存储路径(图片key)
     */
    @NotBlank
    private String path;

    /**
     * 上传文件参数
     */
    @NotBlank
    private String object;

    /**
     * 存储类别 默认 object:对象 base64:二进制流
     */
    @NotBlank
    private String type;

    /**
     * obs桶名称
     */
    @NotBlank
    private String bucket;

    /**
     * 路径标识 1 私有 2 公有 (默认私有)
     */
    private Integer source;
}

备注:
NotBlank 验证参数不为空

4.调用上传接口

private PutObjectResult uploadPrivateBucket(UploadDTO uploadDTO,HuaweiObsConfig huaweiObsConfig){

	PutObjectResult putObjectResult = null;
	String endPoint = "https://your-endpoint";
	String ak = "*** Provide your Access Key ***";
	String sk = "*** Provide your Secret Key ***";
	// 创建ObsClient实例
	//获取文件类型
    String fileType = uploadDTO.getPath().substring(uploadDTO.getPath().lastIndexOf(".") + 1);
    File tempFile = createTempFile(fileType);
    //生成临时文件
    FileOutputStream fos = new FileOutputStream(tempFile);
    boolean success = writeBase64ToFile(uploadDTO.getObject(), fos);
    if(!success) {
        throw new ServiceException(ErrorMsg.FILE_CREATE_ERROR);
    }
    putObjectResult = obsClient.putObject(bucketName, uploadDTO.getPath(), tempFile);
    // 删除临时文件
    tempFile.deleteOnExit();
	return putObjectResult;
                
}

三、本地文件上传 from-data

1.参数示例

代码如下(示例):

{
"path":"h1_test/qrcode/20220622/202206201054548452.png",
"type":"file",
"bucket":"h1-private-test",
"source":1,
"object":"本地上传文件" //二进制流
}

参数名	必选	类型						说明
path	是	string					图片在obs存储路径(图片key)
object	是	file					文件
type	是	string					file:文件
bucket	是	string					obs 桶名称
source	否	int						路径标识 1 私有 2 公有 (默认私有)

2.接口地址

@PostMapping("/obsBucket/uploadFile")
public ResponseMessage<UploadReturnDTO> uploadFile(MultipartFile object,String path, String type, String bucket, Integer source) throws IOException {
     //转化成二进制流
     InputStream inputStream = object.getInputStream();
     UploadDTO uploadDTO = new UploadDTO();
     uploadDTO.setPath(path);
     uploadDTO.setType(type);
     uploadDTO.setBucket(bucket);
     uploadDTO.setSource(source);
     return ResponseMessage.success(uploadResourceRecordService.uploadFileBucket(inputStream,uploadDTO));
 }

备注:
1.from-data 上传接收要用MultipartFile  类型

3.参数信息验证文件

package com.hewa.commonservice.obs.dto;

import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;

/**
 * 上传文件请求参数
 */
@Setter
@Getter
public class UploadDTO implements Serializable {

    /**
     * 图片在obs存储路径(图片key)
     */
    @NotBlank
    private String path;

    /**
     * 上传文件参数
     */
    @NotBlank
    private String object;

    /**
     * 存储类别 默认 object:对象 base64:二进制流
     */
    @NotBlank
    private String type;

    /**
     * obs桶名称
     */
    @NotBlank
    private String bucket;

    /**
     * 路径标识 1 私有 2 公有 (默认私有)
     */
    private Integer source;
}

4. 上传文件

@Override
public UploadReturnDTO uploadFileBucket(InputStream inputStream, UploadDTO uploadDTO) {
	//上传 obs 文件
	String endPoint = "https://your-endpoint";
	String ak = "*** Provide your Access Key ***";
	String sk = "*** Provide your Secret Key ***";
	// 创建ObsClient实例
	ObsClient obsClient = new ObsClient(ak, sk, endPoint);
	PutObjectResult putObjectResult = obsClient.putObject(uploadDTO.getBucket(), uploadDTO.getPath(), inputStream);

    return uploadReturnDTO;
}

5.返回文件转换

返回地址会被转码,这里提供里一种转码格式
//转换文件路径
String objectUrl = putObjectResult.getObjectUrl();
objectUrl =  objectUrl.replace("%2F","/");
uploadResourceRecord.setWholePath(objectUrl);

四、获取url

1.参数示例

代码如下(示例):

{
"path":"1_test/file/20220627/202206201054548452.png",
"source":1,
"bucket":"1-private-test"}

参数名	必选	类型						说明
path	是	string					图片在obs存储路径(图片key)
bucket	是	string					obs 桶名称
source	否	int						路径标识 1 私有 2 公有 (默认私有)

2.接口地址

@PostMapping("/obsBucket/getUrl")
public ResponseMessage<String> getUrl(@RequestBody @Valid GetUrlDTO getUrlDTO){
    System.out.println(getUrlDTO);
    return ResponseMessage.success(getResourceRecordService.getUrl(getUrlDTO));
}

3.参数信息验证文件

package com.hewa.commonservice.obs.dto;

import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;

@Setter
@Getter
public class GetUrlDTO implements Serializable {

    /**
     * 图片在obs存储路径
     */
    @NotBlank
    private String path;

    /**
     * obs 桶名称
     */
    @NotBlank
    private String bucket;

    /**
     * 路径标识 1 私有 2 公有 (默认私有)
     */
    private Integer source;
}

4. 获取文件地址

public String getUrl(GetUrlDTO getUrlDTO){
	//上传 obs 文件
	String endPoint = "https://your-endpoint";
	String ak = "*** Provide your Access Key ***";
	String sk = "*** Provide your Secret Key ***";
	// 创建ObsClient实例
	ObsClient obsClient = new ObsClient(ak, sk, endPoint);
    TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, huaweiObsConfig.getExpireSeconds());
    //设置桶名称
    request.setBucketName(getUrlDTO.getBucket());
    //设置key
    request.setObjectKey(getUrlDTO.getPath());
    //获取文件地址
    TemporarySignatureResponse response = obsClient.createTemporarySignature(request);
    //验证获取文件是否失败
    if(ObjectUtils.isEmpty(response.getSignedUrl())){
        log.error("获取临时文件失败",response);
        throw new ServiceException(ErrorMsg.FILE_URL_ERROR);
    }
    return response.getSignedUrl();
}

备注:

1.getExpireSeconds :过期时间

总结

相互学习,共同进步。如有问题,欢迎留言!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值