網(wǎng)站實現(xiàn)seo公司發(fā)展前景
一、前言
有時在項目中需要使用一些存儲系統(tǒng)來存儲文件,那么當項目要接入obs作為存儲系統(tǒng)時,就會利用obs來進行文件的上傳下載,具體實現(xiàn)如下。
二、如何通過obs實現(xiàn)文件的上傳下載?
1.添加相關(guān)的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:xxxxaccessKey: xxxxxxxxsecretKey: xxxxxxxxxxxbucket: 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 {@Resourceprivate 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);// 設(shè)置元數(shù)據(jù)(可選)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);// 設(shè)置元數(shù)據(jù)(可選)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.文件上傳接口實現(xiàn)示例:
@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服務(wù)異常: " + e.getErrorMessage()); } catch (Exception e) { return ResponseEntity.internalServerError() .body("上傳失敗: " + e.getMessage()); } }
}
有興趣的可以試一試。