BunnyStream TUS视频上传指南:解决401认证错误与参数配置


BunnyStream TUS视频上传指南:解决401认证错误与参数配置

本教程旨在解决使用tus协议上传视频到bunnystream服务时常见的401认证错误。文章详细解析了`authorizationsignature`、`authorizationexpire`、`videoid`、`libraryid`等关键认证参数的正确配置方法,强调了api key的使用、unix时间戳的生成以及bunnycdn信任站点的重要性。通过提供修正后的代码示例和注意事项,帮助开发者成功实现视频上传。

引言

TUS(The Upload Server)是一种基于HTTP的可恢复文件上传协议,它允许客户端在网络中断后从中断点继续上传文件,极大地提升了大型文件上传的稳定性和用户体验。BunnyStream作为BunnyCDN的视频流服务,支持通过TUS协议进行视频上传。然而,开发者在使用TUS上传视频到BunnyStream时,常会遇到401 Unauthorized错误。本文将深入探讨导致此错误的原因,并提供一套完整的解决方案和最佳实践。

理解401认证错误

当TUS上传请求返回401 Unauthorized错误时,这通常意味着服务器拒绝了客户端的请求,因为客户端未能提供有效的认证凭据。在BunnyStream的TUS上传场景中,这通常指向以下几个方面的问题:

  1. AuthorizationSignature 签名不正确:这是最常见的原因,签名没有按照BunnyStream的要求正确生成。
  2. AuthorizationExpire 过期时间不正确或已过期:提供的Unix时间戳不是未来的时间,或者格式有误。
  3. AccessKey(API Key)使用错误:使用了错误的密钥,例如非视频库的API Key。
  4. LibraryId 或 VideoId 不匹配:提供的视频库ID或视频ID与实际不符。
  5. CORS(跨域资源共享)问题:如果你的前端应用与BunnyCDN的TUS上传端点不在同一域,需要确保BunnyCDN后台已配置允许你的域进行访问。

BunnyStream TUS上传的关键参数解析

成功进行BunnyStream TUS上传,需要正确配置HTTP请求头中的多个参数,尤其是在签名生成环节。

1. AuthorizationSignature:签名生成机制

AuthorizationSignature 是用于验证请求合法性的SHA256哈希签名。其生成公式如下:

SHA256(LibraryId + ApiKey + ExpirationTime + VideoId)
  • LibraryId: 你的BunnyStream视频库的唯一标识符。
  • ApiKey: 你的BunnyCDN账号的API Key(通常在"Account Settings" -> "API"中获取,注意不是Stream Key或Access Key,而是主API Key)。
  • ExpirationTime: 一个Unix时间戳,表示此签名何时过期。这个时间必须是未来的时间。
  • VideoId: 待上传视频的GUID。这个GUID通常在你通过BunnyStream的"Create Video" API调用预先创建视频对象时获得。

关键点:

  • ApiKey 必须是你的BunnyCDN主API Key,而不是其他任何密钥。
  • 所有参数连接时,不应有额外的分隔符或空格。

2. AuthorizationExpire:授权过期时间

这个HTTP头的值就是签名生成公式中的 ExpirationTime,它是一个Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数)。

关键点:

  • 必须是未来的时间:如果提供的过期时间早于当前时间,上传请求将立即被拒绝。
  • 适当的有效期:建议设置一个合理的未来时间,例如当前时间加一天或几小时,以确保上传过程中签名不会过期。

3. VideoId:视频标识符

这是你通过BunnyStream API预先创建视频时获得的GUID。TUS上传是针对一个已经存在的视频占位符进行的。

4. LibraryId:视频库ID

你的BunnyStream视频库的唯一数字ID。

Viggle AI Video Viggle AI Video

Powerful AI-powered animation tool and image-to-video AI generator.

Viggle AI Video 115 查看详情 Viggle AI Video

5. metadata:元数据配置

在TUS上传中,你可以在 metadata 字段中传递额外的文件信息,例如 filetype、title、collection 等。这些信息将在上传完成后关联到视频对象。

  • collection: 如果视频属于某个集合,可以在这里指定集合的ID。

示例代码与修正

以下是一个修正后的J*aScript TUS上传代码示例,它解决了常见的认证问题。

// 引入必要的库,例如tus-js-client和crypto-js(用于SHA256)
// npm install tus-js-client crypto-js

import * as tus from 'tus-js-client';
import CryptoJS from 'crypto-js'; // 确保安装了crypto-js

// 假设这些变量在你的应用中是可用的
const BUNNY_CDN_API_KEY = 'YOUR_BUNNYCDN_API_KEY'; // 替换为你的BunnyCDN主API Key
const BUNNY_STREAM_LIBRARY_ID = 'YOUR_BUNNYSTREAM_LIBRARY_ID'; // 替换为你的视频库ID

/**
 * 获取未来某个时刻的Unix时间戳(秒)
 * @param {number} daysToAdd 增加的天数
 * @returns {number} Unix时间戳
 */
function getFutureUnixTimestamp(daysToAdd = 1) {
    const now = new Date();
    now.setDate(now.getDate() + daysToAdd); // 增加指定天数
    return Math.floor(now.getTime() / 1000); // 转换为Unix时间戳(秒)
}

/**
 * 上传视频到BunnyStream
 * @param {File} file 待上传的File对象
 * @param {object} videoJson 从BunnyStream Create Video API返回的JSON对象,包含guid
 * @param {string} collectionId 视频所属的集合ID (可选)
 */
function UploadVideo(file, videoJson, collectionId) {
    const videoGuid = videoJson.guid; // 从预创建视频的响应中获取GUID
    const expirationTime = getFutureUnixTimestamp(1); // 设置过期时间为未来一天

    // 生成AuthorizationSignature
    const signaturePayload = BUNNY_STREAM_LIBRARY_ID + BUNNY_CDN_API_KEY + expirationTime + videoGuid;
    const authorizationSignature = CryptoJS.SHA256(signaturePayload).toString(CryptoJS.enc.Hex);

    // 创建一个新的tus上传实例
    var upload = new tus.Upload(file, {
        endpoint: "https://video.bunnycdn.com/tusupload",
        retryDelays: [0, 3000, 5000, 10000, 20000, 60000, 60000], // 重试策略
        headers: {
            AuthorizationSignature: authorizationSignature,
            AuthorizationExpire: expirationTime,
            VideoId: videoGuid,
            LibraryId: BUNNY_STREAM_LIBRARY_ID,
        },
        metadata: {
            filetype: file.type,
            title: 'My Video Upload from JS', // 可以动态设置视频标题
            collection: collectionId || '' // 如果有collectionId则使用,否则为空
        },
        onError: function (error) {
            console.error("TUS Upload Error:", error);
            // 可以在这里添加错误提示给用户
        },
        onProgress: function (bytesUploaded, bytesTotal) {
            var percentage = (bytesUploaded / bytesTotal * 100).toFixed(2);
            // 假设有一个progressBar元素
            // progressBar.style.width = percentage + "%";
            console.log(`Uploaded: ${bytesUploaded} of ${bytesTotal} (${percentage}%)`);
        },
        onSuccess: () => {
            console.log('File uploaded successfully!');
            // 可以在这里进行上传成功后的处理,例如刷新页面或显示成功消息
        }
    });

    // 检查是否有之前的上传可以继续
    upload.findPreviousUploads().then(function (previousUploads) {
        if (previousUploads.length) {
            console.log("Resuming from previous upload...");
            upload.resumeFromPreviousUpload(previousUploads[0]);
        }
        // 开始上传
        upload.start();
    }).catch(error => {
        console.error("Error finding previous uploads:", error);
        // 如果查找失败,仍然尝试开始新的上传
        upload.start();
    });
}

// 示例调用 (在实际应用中,file, videoJson, collectionId 会从用户界面或后端获取)
/*
// 假设你有一个文件输入框
const fileInput = document.getElementById('file-input');
fileInput.addEventListener('change', (event) => {
    const selectedFile = event.target.files[0];
    if (selectedFile) {
        // 假设你已经通过BunnyStream API预创建了一个视频,并获取了其GUID
        const mockVideoJson = { guid: 'YOUR_PRE_CREATED_VIDEO_GUID' };
        const mockCollectionId = 'YOUR_COLLECTION_ID'; // 如果有的话

        UploadVideo(selectedFile, mockVideoJson, mockCollectionId);
    }
});
*/

代码修正要点:

  1. BUNNY_CDN_API_KEY:明确指出这里应使用你的BunnyCDN主API Key,而不是其他任何密钥。
  2. getFutureUnixTimestamp():添加了一个辅助函数来动态生成一个未来的Unix时间戳,确保 AuthorizationExpire 总是有效的。
  3. authorizationSignature:签名生成时,确保 BUNNY_CDN_API_KEY、expirationTime 和 videoGuid 的值是正确的。
  4. videoGuid:强调 VideoId 应该来自预先创建的视频对象。
  5. collectionId:在 metadata 中正确传递。

重要注意事项

1. BunnyCDN信任站点配置

如果你的前端应用与BunnyStream的TUS上传端点不在同一域,你需要在BunnyCDN控制面板中配置“信任站点”(Trusted Sites)。这通常在你的视频库设置中找到,用于允许特定的域名进行API调用和上传,以避免CORS(跨域资源共享)问题。务必将你的前端应用的域名添加到信任列表中。

2. API Key的正确使用

BunnyCDN有多种密钥,例如API Key、Stream Key等。TUS上传所需的签名中,ApiKey 参数必须是你的主API Key,而不是Stream Key。Stream Key通常用于直接推流或管理特定视频流。

3. 错误处理与重试策略

tus-js-client 库内置了强大的重试机制(retryDelays),这对于网络不稳定的环境非常有用。然而,对于认证错误(如401),重试通常无济于事,因为问题在于凭据本身。因此,在 onError 回调中,除了记录错误,还应考虑向用户提供明确的反馈,例如“认证失败,请检查您的API配置”。

4. 预创建视频的重要性

TUS上传不是直接创建视频,而是将文件上传到BunnyStream中一个已经存在的视频占位符。这意味着你需要先通过BunnyStream的“Create Video”API调用来获取一个 VideoId (GUID),然后才能使用TUS协议上传文件。

总结

成功实现BunnyStream TUS视频上传的关键在于精确配置认证参数和理解BunnyCDN的平台要求。通过确保 AuthorizationSignature 的正确生成(特别是 ApiKey 和 ExpirationTime 的准确性)、LibraryId 和 VideoId 的匹配,以及正确配置BunnyCDN的信任站点,可以有效避免401 Unauthorized错误。遵循本教程的指导和代码示例,开发者将能够稳定、高效地将视频上传到BunnyStream服务。

以上就是BunnyStream TUS视频上传指南:解决401认证错误与参数配置的详细内容,更多请关注其它相关文章!


# java  # 网站营销推广文案  # seo有哪些成员明星  # 不正确  # 客户端  # 而不是  # 文件上传  # 有什么  # 重试  # 在这里  # 未来  # AI-powered  # 跨域  # javascript  # js  # 前端  # json  # npm  # access  # 后端  # unix  # cdn  # stream  # 上传  # 做网站推广代运营赚钱吗  # 关键词有排名加益价吗  # 漳州短视频推广招聘网站  # 黄梅seo推广网址大全  # 临沂专业seo报价公司  # 网站建设预算和维护  # 厦门销售网站建设案例  # 烟台seo搜索栏 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 12306售票时间最新规定 | 网上订票和车站窗口时间一样吗  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程  PHP中实现JSON数据数组分页的教程  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  PDF文件去水印平台入口 PDF水印删除网址  sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧  英国搜索:多数英国人认为语言搜索是未来搜索  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  歌词怎么展示在|直播|间视频号?有什么注意事项?  我的世界官方网址入口 我的世界游戏主页直达入口  Google Cloud Functions 时区处理指南:理解与最佳实践  pubmed数据库官方主页_pubmed学术论文查找官网直达  Win10输入法不见了怎么办 Win10找回语言栏图标教程  企查查官网和爱企查 企查查企业查询官网入口  《下一站江湖2》风神腿获取攻略  优化 WooCommerce 产品价格显示与自定义短代码集成  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  百度网盘网页入口链接分享 百度网盘官网入口网页登录  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  《盗墓笔记手游》技能介绍  传统曲艺莲花落的表演形式是  优化2xN网格最大路径和的动态规划算法实践  b站网页版入口 哔哩哔哩官方网站直接进入  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  163邮箱登录入口官网 163.com邮箱登录入口  解决异步Python机器人中同步操作的阻塞问题  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  驱动人生:游戏修复指南  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  《金山词霸》语音翻译方法  汽车之家网页版免费登录_汽车之家官网首页直接进入  知音漫客官网首页入口_知音漫客热门漫画推荐  Excel宏怎么删除_Excel中删除宏的详细操作流程  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  网页版网易云音乐入口_网易云音乐在线官网登录  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  《图怪兽》退出登录方法  如何查找哪个composer包引入了特定的依赖?  《tt语音》超级玩家开通方法  Go反射进阶:访问内嵌结构体中的被遮蔽方法  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  优化Google Charts Gauge:在数据库无数据时显示默认值 

 2025-11-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.