基于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.
验证注意事项
- 你已经将视频转为碎片化MP4、SEGW开启Media功能的前置条件无需额外调整
- 可先用Postman调用OData媒体资源接口,请求头加
Range: bytes=0-1023,验证返回状态码为206,且Content-Range头符合预期后再到前端测试
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

