最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC流式傳輸媒體數(shù)據(jù)的方法

 更新時(shí)間:2025年07月03日 08:59:27   作者:javadoge  
Spring Boot利用ResourceHttpRequestHandler實(shí)現(xiàn)媒體流傳輸,支持分片加載避免全量下載,需自定義繼承該類,重寫getResource方法,并配置ResponseEntity及異常處理,推薦使用MinIO或視頻云點(diǎn)播優(yōu)化性能,本文給大家介紹SpringMVC流式傳輸媒體數(shù)據(jù)的方法,感興趣的朋友一起看看吧

借助Spring的ResourceHttpRequestHandler可以實(shí)現(xiàn)媒體數(shù)據(jù)的傳輸,比如在線播放視頻、預(yù)覽圖片等。

目前已知Spring Boot傳輸視頻流的方法

  • 讀取整個(gè)視頻文件,然后把文件流寫入HttpServletResponse的OutputStream。
    (此方法可行,但是需要消耗較多的服務(wù)器資源,且客戶端需要下載整個(gè)視頻才能播放)
  • 使用HTTP的Range實(shí)現(xiàn)分片加載,但是需要手動(dòng)實(shí)現(xiàn),比較麻煩。
  • 使用Spring自帶的ResourceHttpRequestHandler是最佳實(shí)踐。

思路

ResourceHttpRequestHandler是Spring Boot用于加載靜態(tài)資源的一個(gè)類,默認(rèn)用于從"classpath:/static"等目錄讀取靜態(tài)資源,以便前端訪問。我們可以繼承它自定義一個(gè)實(shí)現(xiàn)。

使用方法

在項(xiàng)目的config包(推薦)繼承ResourceHttpRequestHandler并重寫getResource方法,使其返回所需要呈現(xiàn)給前端的資源(org.springframework.core.io.Resource)

package com.example.server.config;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import java.net.MalformedURLException;
import java.nio.file.Path;
import java.util.List;
@Component
public class CustomResourceHttpRequestHandler extends ResourceHttpRequestHandler {
    private Resource resource;
    @Override
    protected Resource getResource(@NonNull HttpServletRequest request) {
        return this.resource;
    }
    public void setResource(Path filePath) throws MalformedURLException {
        this.resource = new UrlResource(filePath.toUri());
        setLocations(List.of(this.resource));
    }
}

控制層注入CustomResourceHttpRequestHandler,并向setResource方法傳入文件路徑(java.nio.file.Path),設(shè)置請(qǐng)求頭,最后讓customResourceHttpRequestHandler處理請(qǐng)求。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.file.Path;
import java.nio.file.Paths;
@Controller
@RequestMapping("/files")
public class FileController {
    @Autowired
    private CustomResourceHttpRequestHandler resourceHttpRequestHandler;
    @GetMapping("/{filename}")
    public ResponseEntity<?> getFile(@PathVariable String filename, HttpServletRequest request, HttpServletResponse response) {
        try {
            // 解析文件路徑
            Path filePath = Paths.get("D:/StorageService").resolve(filename).normalize();
            // 檢查文件是否存在
            if (!filePath.toFile().exists()) {
                return new ResponseEntity<>(HttpStatus.NOT_FOUND);
            }
            // 設(shè)置資源路徑
            resourceHttpRequestHandler.setResource(filePath);
            // 設(shè)置響應(yīng)頭,inline 會(huì)在瀏覽器中顯示或播放文件
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + filename + "\"");
            // 讓 CustomResourceHttpRequestHandler 處理請(qǐng)求
            resourceHttpRequestHandler.handleRequest(request, response);
            return new ResponseEntity<>(HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}

注意點(diǎn)

控制層返回值需要ResponseEntity類型(org.springframework.http.ResponseEntity),且try-catch不能省略,否則可能會(huì)不斷拋出異常(AsyncRequestNotUsableException和IOException)但不影響正常使用。

其他方案

如果有條件也可以使用MinIO,或者視頻云點(diǎn)播VOD。他們提供了現(xiàn)成的解決方案,通過調(diào)用API可以獲取視頻等文件的直鏈。

參考資料

springboot+vue播放視頻流(無需下載視頻,可以拖動(dòng)進(jìn)度、倍速播放)

到此這篇關(guān)于java的文章就介紹到這了,更多相關(guān)java內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC 限流的示例代碼

    SpringMVC 限流的示例代碼

    這篇文章主要介紹了SpringMVC 限流的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解Java內(nèi)存泄露的示例代碼

    詳解Java內(nèi)存泄露的示例代碼

    這篇文章通過一個(gè)Demo來簡要介紹下ThreadLocal和ClassLoader導(dǎo)致內(nèi)存泄露最終OutOfMemory的場(chǎng)景。下面通過示例代碼給大家分享Java內(nèi)存泄露的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-12-12
  • java 線程池的實(shí)現(xiàn)方法

    java 線程池的實(shí)現(xiàn)方法

    在本篇文章里小編給大家整理了關(guān)于java 線程池的實(shí)現(xiàn)方法,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • Java的jstack命令使用示例詳解

    Java的jstack命令使用示例詳解

    jstack 命令非常的簡單,我們可以通過 jstack -h 或者 jstack -help 命令查看它的用法詳情,今天通過本文重點(diǎn)給大家介紹Java的jstack命令使用,感興趣的朋友一起看看吧
    2022-03-03
  • Java利用SpEL表達(dá)式實(shí)現(xiàn)權(quán)限校驗(yàn)

    Java利用SpEL表達(dá)式實(shí)現(xiàn)權(quán)限校驗(yàn)

    這篇文章主要為大家詳細(xì)介紹了Java如何利用SpEL表達(dá)式實(shí)現(xiàn)權(quán)限校驗(yàn)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • SpringBoot集成FastDFS實(shí)現(xiàn)防盜鏈功能

    SpringBoot集成FastDFS實(shí)現(xiàn)防盜鏈功能

    FastDFS是一個(gè)高性能的分布式?件系統(tǒng),本文將為大家詳細(xì)介紹一下SpringBoot如何集成FastDFS實(shí)現(xiàn)防盜鏈功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • java中字符進(jìn)行全角半角轉(zhuǎn)換示例代碼

    java中字符進(jìn)行全角半角轉(zhuǎn)換示例代碼

    全角:指一個(gè)字符占用兩個(gè)標(biāo)準(zhǔn)字符位置,而半角:指一字符占用一個(gè)標(biāo)準(zhǔn)的字符位置,在日常開發(fā)中經(jīng)常會(huì)遇到全角半角轉(zhuǎn)換的要求,下面這篇文章主要給大家介紹了關(guān)于java中字符進(jìn)行全角半角轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-08-08
  • 一文詳解如何使用Spring MVC實(shí)現(xiàn)RESTful API接口

    一文詳解如何使用Spring MVC實(shí)現(xiàn)RESTful API接口

    本文主要介紹了如何使用SpringMVC實(shí)現(xiàn)RESTful API,包括RESTful的核心概念、設(shè)計(jì)原則、傳參方式比較、SpringMVC實(shí)現(xiàn)示例及關(guān)鍵注解說明,還介紹了API測(cè)試工具和SpringMVC的匹配機(jī)制,強(qiáng)調(diào)了在實(shí)際開發(fā)中保持RESTful風(fēng)格的一致性和合理設(shè)計(jì)資源路徑的重要性
    2025-10-10
  • 6種SpringBoot解決跨域請(qǐng)求的方法整理

    6種SpringBoot解決跨域請(qǐng)求的方法整理

    跨域資源共享是一種標(biāo)準(zhǔn)機(jī)制,允許服務(wù)器聲明哪些源可以訪問其資源,在SpringBoot應(yīng)用中,有多種方式可以解決跨域問題,本文主要介紹了6種常見的解決方案,大家可以根據(jù)需求自行選擇
    2025-04-04
  • Java實(shí)現(xiàn)SHA-256加密算法的完全解析

    Java實(shí)現(xiàn)SHA-256加密算法的完全解析

    SHA-256是一種散列(哈希)算法,用于將任意長度的數(shù)據(jù)映射為固定長度的散列值,以保證數(shù)據(jù)完整性。本文將為大家介紹一下SHA-256加密算法的原理與實(shí)現(xiàn),希望對(duì)大家有所幫助
    2023-02-02

最新評(píng)論

大洼县| 佳木斯市| 游戏| 海城市| 正定县| 澄江县| 衡东县| 富蕴县| 体育| 建宁县| 义马市| 武山县| 东平县| 黄梅县| 雅安市| 炎陵县| 郴州市| 来宾市| 新兴县| 乐业县| 郁南县| 平度市| 杭锦后旗| 五台县| 楚雄市| 姚安县| 象州县| 高淳县| 丽江市| 如东县| 日土县| 阿坝县| 葫芦岛市| 乐东| 南城县| 吉隆县| 梅河口市| 吴旗县| 合作市| 陆丰市| 凌海市|