java返回 视频流。从minio获取流,兼容safari,快进快退

    public void downloadSlice(String bucketName, String filename, HttpServletResponse response,
                              HttpServletRequest request) throws Exception {
        if (StringUtils.isNotBlank(filename)) {
            String range = request.getHeader("Range");
            //获取文件信息
            StatObjectResponse statObjectResponse = minioClient.statObject(
                    StatObjectArgs.builder().bucket(bucketName).object(filename).build());
            //开始下载位置
            long startByte = 0;
            //结束下载位置
            long endByte = statObjectResponse.size() - 1;

            //有range的话
            if (StringUtils.isNotBlank(range) && range.contains("bytes=") && range.contains("-")) {
                range = range.substring(range.lastIndexOf("=") + 1).trim();
                String[] ranges = range.split("-");
                try {
                    //判断range的类型
                    if (ranges.length == 1) {
                        //类型一:bytes=-2343
                        if (range.startsWith("-")) {
                            endByte = Long.parseLong(ranges[0]);
                        }
                        //类型二:bytes=2343-
                        else if (range.endsWith("-")) {
                            startByte = Long.parseLong(ranges[0]);
                        }
                    }
                    //类型三:bytes=22-2343
                    else if (ranges.length == 2) {
                        startByte = Long.parseLong(ranges[0]);
                        endByte = Long.parseLong(ranges[1]);
                    }

                } catch (NumberFormatException e) {
                    startByte = 0;
                    endByte = statObjectResponse.size() - 1;
                }
            }

            //要下载的长度
            long contentLength = endByte - startByte + 1;
            //文件类型
            String contentType = request.getServletContext().getMimeType(filename);

            //解决下载文件时文件名乱码问题
            byte[] fileNameBytes = filename.getBytes(StandardCharsets.UTF_8);
            filename = new String(fileNameBytes, 0, fileNameBytes.length, StandardCharsets.ISO_8859_1);

            //各种响应头设置
            //支持断点续传,获取部分字节内容:
            response.setHeader("Accept-Ranges", "bytes");
            //http状态码要为206:表示获取部分内容
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
            response.setContentType(contentType);
            response.setHeader("Last-Modified", statObjectResponse.lastModified().toString());
            //inline表示浏览器直接使用,attachment表示下载,fileName表示下载的文件名
            response.setHeader("Content-Disposition", "inline;filename=" + filename);
            response.setHeader("Content-Length", String.valueOf(contentLength));
            //Content-Range,格式为:[要下载的开始位置]-[结束位置]/[文件总大小]
            response.setHeader("Content-Range", "bytes " + startByte + "-" + endByte + "/" + statObjectResponse.size());
            response.setHeader("ETag", "\"".concat(statObjectResponse.etag()).concat("\""));

            try {
                GetObjectResponse stream = minioClient.getObject(
                        GetObjectArgs.builder()
                                .bucket(statObjectResponse.bucket())
                                .object(statObjectResponse.object())
                                .offset(startByte)
                                .length(contentLength)
                                .build());
                BufferedOutputStream os = new BufferedOutputStream(response.getOutputStream());
                byte[] buffer = new byte[1024];
                int len;
                while ((len = stream.read(buffer)) != -1) {
                    os.write(buffer, 0, len);
                }
                os.flush();
                os.close();
                response.flushBuffer();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Java获取MinIO服务器上的TIFF文件,你需要先确定你的MinIO服务的URL、访问密钥和密钥。以下是一般步骤: 1. 添加MinIO Java客户端SDK依赖到你的项目中,确保可以通过这个库来与MinIO服务交互。 2. 创建一个MinIO客户端实例,使用你的服务URL、访问密钥和密钥。 3. 使用客户端实例定位到你的桶(Bucket)中的特定TIFF文件。 4. 使用适当的API方法从MinIO获取文件。 以下是一个示例代码,说明如何实现上述步骤: ```java import io.minio.*; import io.minio.messages.Bucket; import java.io.InputStream; import java.util.List; public class MinioClientExample { public static void main(String[] args) { try { // 创建MinIO客户端实例。 MinioClient minioClient = MinioClient.builder() .endpoint("https://play.min.io") // MinIO服务的URL .credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG") // 访问密钥和密钥 .build(); // 检查桶是否存在于服务中。 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("my-bucket-name").build()); if (found) { System.out.println("Bucket found"); // 获取文件。 InputStream fileStream = minioClient.getObject( GetObjectArgs.builder().bucket("my-bucket-name").object("my-object-name.tiff").build()); // 在这里你可以使用fileStream进行你需要的文件操作。 } else { System.out.println("Bucket not found."); } } catch (Exception e) { e.printStackTrace(); } } } ``` 这个例子中,你需要将`play.min.io`替换为你的MinIO服务器地址,将`my-bucket-name`替换为你的桶名,将`my-object-name.tiff`替换为你想获取的TIFF文件名,将`Q3AM3UQ867SPQQA43P2F`和`zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG`替换为你的访问密钥和密钥。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值