You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SAP Gateway实现向SAPUI5应用返回HTTP 206视频流的咨询

SAP Gateway视频流适配Chrome进度拖动改造方案

你当前的ABAP实现可以调整为支持Chrome识别的HTTP 206返回形式,核心是适配浏览器的Range分段请求规范,改造步骤如下:

改造前逻辑说明

你现有代码是直接返回全量视频流,默认返回HTTP 200状态码,仅Firefox支持这种场景下的进度调整,Chrome/Edge必须要求服务端支持分段请求才能实现进度拖动。

完整改造后代码示例

DATA: ls_stream TYPE /iwbep/if_mgw_core_srv_runtime=>ty_s_media_resource,
      lo_mime   TYPE REF TO cl_mime_repository_api,
      lv_range  TYPE string,
      lv_full_length TYPE i,
      lv_start  TYPE i,
      lv_end    TYPE i,
      lv_send_length TYPE i.

" 1. 读取MIME仓库视频资源
lo_mime = cl_mime_repository_api=>get_api( ).
lo_mime->get(
  EXPORTING
    i_url = 'MIME_PATH/video.mp4'
  IMPORTING
    e_content = ls_stream-value
    e_mime_type = ls_stream-mimetype
).

IF ls_stream-mimetype = 'video/mp4'.
  " 2. 获取请求头的Range参数,判断是否为分段请求
  lv_range = /iwbep/cl_mgw_request=>get_instance( )->get_header_field( iv_name = 'Range' ).
  lv_full_length = xstrlen( ls_stream-value ).

  " 3. 解析Range参数,计算需要返回的分段起止位置
  IF lv_range IS NOT INITIAL.
    REPLACE 'bytes=' IN lv_range WITH ''.
    SPLIT lv_range AT '-' INTO lv_start lv_end.
    " 处理末尾段请求无end参数的场景
    IF lv_end IS INITIAL OR lv_end >= lv_full_length.
      lv_end = lv_full_length - 1.
    ENDIF.
    lv_send_length = lv_end - lv_start + 1.
  ELSE.
    " 无Range请求返回全量内容
    lv_start = 0.
    lv_end = lv_full_length - 1.
    lv_send_length = lv_full_length.
  ENDIF.

  " 4. 通用响应头设置
  SET_HEADER( is_header = VALUE #( name = 'Content-Disposition' value = 'inline; filename=video.mp4' ) ).
  SET_HEADER( is_header = VALUE #( name = 'Accept-Ranges' value = 'bytes' ) ).
  SET_HEADER( is_header = VALUE #( name = 'Content-Length' value = CONV #( lv_send_length ) ) ).

  " 5. 分段请求特殊处理
  IF lv_range IS NOT INITIAL.
    " 设置HTTP 206状态码
    /iwbep/cl_mgw_response=>get_instance( )->set_status_code( iv_status_code = '206' ).
    " 设置Content-Range响应头
    SET_HEADER( is_header = VALUE #( 
      name = 'Content-Range' 
      value = |bytes { lv_start }-{ lv_end }/{ lv_full_length }| 
    ) ).
    " 裁剪二进制流,仅返回请求的分段内容
    ls_stream-value = ls_stream-value+lv_start(lv_send_length).
  ENDIF.

  " 6. 返回流数据
  copy_data_to_ref(
    EXPORTING
      is_data = ls_stream
    CHANGING
      cr_data = er_stream
  ).
ENDIF.

验证注意事项

  1. 你已经将视频转为碎片化MP4、SEGW开启Media功能的前置条件无需额外调整
  2. 可先用Postman调用OData媒体资源接口,请求头加Range: bytes=0-1023,验证返回状态码为206,且Content-Range头符合预期后再到前端测试

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:15:05