range请求头读取流媒体文件指定片段

/**
     * 获取流媒体文件
     * @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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值