华为obs 上传及下载
前言
提示:这里可以添加本文要记录的大概内容:
本文主要针对 华为 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 :过期时间
总结
相互学习,共同进步。如有问题,欢迎留言!