公司要从阿里的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方式,前端直接上传文件。