springboot实现文件上传到华为云的obs
一、前言
有时在项目中需要使用一些存储系统来存储文件,那么当项目要接入obs作为存储系统时,就会利用obs来进行文件的上传下载,具体实现如下。
二、如何通过obs实现文件的上传下载?
1.添加相关的obs的maven依赖。
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>esdk-obs-java-bundle</artifactId>
<version>3.23.9</version>
</dependency>
2.配置obs客户端连接。
@Configuration
@Data
public class OBSConfig {
@Value("${obs.accessKey}")
private String accessKey;
@Value("${obs.secretKey}")
private String secretKey;
@Value("${obs.endpoint}")
private String endpoint;
@Value("${obs.bucket}")
private String bucketName;
}
3.在YAML添加obs配置。
obs:
endpoint: http://xxxxxx:xxxx
accessKey: xxxxxxxx
secretKey: xxxxxxxxxxx
bucket: my-bucket
4.定义obs工具类,代码如下:
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.CompleteMultipartUploadRequest;
import com.obs.services.model.CompleteMultipartUploadResult;
import com.obs.services.model.ObjectMetadata;
import com.obs.services.model.PutObjectRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.InputStream;
import java.util.UUID;
@Component
public class ObsUtil {
@Resource
private OBSConfig oBSConfig;
private ObsClient obsClient;
public ObsClient getClient() {
if (obsClient == null) {
obsClient = new ObsClient(oBSConfig.getAccessKey, oBSConfig.getSecretKey, oBSConfig.getEndPoint);
}
return obsClient;
}
/**
* 上传文件到OBS
*
* @param file 待上传的文件
* @return 返回文件的访问路径
*/
public String uploadFile(File file) {
try (ObsClient obsClient = getObsClient()) {
// 生成唯一的文件名
String fileName = UUID.randomUUID().toString() + "-" + file.getName();
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file);
// 设置元数据(可选)
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/octet-stream");
putObjectRequest.setMetadata(metadata);
obsClient.putObject(putObjectRequest);
return endpoint + "/" + bucketName + "/" + fileName;
} catch (ObsException e) {
throw new RuntimeException("上传文件失败:" + e.getMessage(), e);
}
}
/**
* 上传文件流到OBS
*
* @param inputStream 文件输入流
* @param fileName 文件名
* @return 返回文件的访问路径
*/
public String uploadInputStream(InputStream inputStream, String fileName) {
try (ObsClient obsClient = getObsClient()) {
// 生成唯一的文件名
String objectKey = UUID.randomUUID().toString() + "-" + fileName;
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, inputStream);
// 设置元数据(可选)
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/octet-stream");
putObjectRequest.setMetadata(metadata);
obsClient.putObject(putObjectRequest);
return endpoint + "/" + bucketName + "/" + objectKey;
} catch (ObsException e) {
throw new RuntimeException("上传文件流失败:" + e.getMessage(), e);
}
}
/**
* 下载文件
*
* @param objectKey 对象键(文件名)
* @param savePath 保存路径
*/
public Inputstream downloadFile(String objectKey, String savePath) {
try (ObsClient obsClient = getObsClient()) {
GetObjectRequest request = new GetObjectRequest();
request.setBucketName(StringUtils.isEmpty(bucket) ? oBSConfig.getBucket : bucket);
String objectName = (originFilePath == null ? "" : originFilePath) + fileName;
objectName = objectName.charAt(0) == '/' ? objectName.substring(1) : objectName;
request.setObjectKey(objectName);
if (offset != null) {
request.setRangeStart(offset);
if (length != null) {
request.setRangeEnd(offset + length);
}
}
ObsObject object = client.getObject(request);
return object.getObjectContent();
} catch (ObsException e) {
throw new RuntimeException("下载文件失败:" + e.getMessage(), e);
}
}
/**
* 删除文件
*
* @param objectKey 对象键(文件名)
*/
public void deleteFile(String objectKey) {
try (ObsClient obsClient = getObsClient()) {
obsClient.deleteObject(bucketName, objectKey);
} catch (ObsException e) {
throw new RuntimeException("删除文件失败:" + e.getMessage(), e);
}
}
}
5.文件上传接口实现示例:
@RestController
@RequestMapping("/obs")
public class OBSUploadController {
@Autowired
private ObsUtil obsUtil ;
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(
@RequestParam("file") MultipartFile file
) {
try {
obsUtil.uploadFile(file.getInputStream(),"xxxx");
return ResponseEntity.ok("OBS路径: " + objectKey);
} catch (ObsException e) {
return ResponseEntity.status(e.getResponseCode())
.body("OBS服务异常: " + e.getErrorMessage());
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("上传失败: " + e.getMessage());
}
}
}
有兴趣的可以试一试。