/**
* 获取流媒体文件
* @param headers
* @param bucketName
* @param fileName
* @return
* @throws Exception
*/
public ResponseEntity<Resource> getMedia(HttpHeaders headers,String bucketName,String fileName) {
if(StringUtils.isBlank(bucketName)){
bucketName = properties.getBucket();
}
try{
if (null == client) {
init();
}
// 获取对象统计信息(例如文件大小、Content-Type)
StatObjectResponse objectStat = client.statObject(
StatObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.build()
);
// 获取文件的 MIME 类型
String mimeType = objectStat.contentType();
// 获取 Range 请求头
List<HttpRange> ranges = headers.getRange();
long fileLength = objectStat.size();
if (ranges.isEmpty()) {
// 没有 Range 请求头,返回整个文件
InputStream fullStream = client.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.build()
);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_TYPE, mimeType)
.header(HttpHeaders.CACHE_CONTROL, "max-age=3600")
.header(HttpHeaders.ETAG, objectStat.etag())
.contentLength(fileLength)
.body(new InputStreamResource(fullStream));
}
// 处理 Range 请求,返回部分内容
HttpRange range = ranges.get(0);
long start = range.getRangeStart(fileLength);
long end = range.getRangeEnd(fileLength);
// 获取部分内容的 InputStream
InputStream partialStream = client.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.offset(start)
.length(end - start + 1)
.build()
);
return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
.header(HttpHeaders.CONTENT_TYPE, mimeType)
.header(HttpHeaders.CONTENT_RANGE, "bytes " + start + "-" + end + "/" + fileLength)
.header(HttpHeaders.CACHE_CONTROL, "max-age=3600")
.header(HttpHeaders.ETAG, objectStat.etag())
.contentLength(end - start + 1)
.body(new InputStreamResource(partialStream));
range请求头读取流媒体文件指定片段
最新推荐文章于 2025-12-30 20:41:53 发布
905

被折叠的 条评论
为什么被折叠?



