java百度云文件上传_关于如何在自己项目集成百度云BCE文件上传STS方案

1、 项目背景

由于本人项目需要,需要在视频点播服务之中需要加载字幕文件(通用格式srt),经过比较好几家的公有云服务,最后选择只有百度云提供字幕服务。

字幕:我们通常在观看外语电影的是,没有国语版时候只能通过下载字幕,了解其中表达的意义。

百度云提供多种授权方式,但是为了保障数据能够安全授权,最后使用STS(Security Token Service)临时授权的方式来实现视频文件的上传,具体操作如下图所示流程:

260696?pageNo=1

e8ee634a8a57ab443a2c4cb038c21ac3.png

2、百度云提供示例及大坑:

百度云提供的示例都在github上,应该是百度上海一个员工在维护,具体地址如下:

其中一个大坑:

这些提供的示例:都是为可考虑您在本地能够运行,都模拟了一个简单的HttpServer服务然后按照相关的示例运行步骤都可以正常运行和上传资源到您自己的百度云服务器之中。具体可参考如下所示的操作:

bce-sdk-js samples

初始化

运行 sample 代码之前,首先需要修改一下 config.json,添加ak, sk, bucket 的配置:

项目

默认值

port

8800

enable_sts

true

ak

sk

bucket

endpoint

https://bj.bcebos.com

安装依赖

npm install

根据配置文件 config.json,自动生成一些代码

npm run prepare

启动 server

类别

命令

frontend

node frontend/main.js

Node.js backend

cd backend/nodejs; node main.js

php backend

cd backend/php; php main.php

java backend

cd backend/java; mvn clean install exec:java -Dexec.mainClass=com.baidu.inf.bce.App

关于 crossdomain.xml

IE下面跨域请求是通用 moxie.swf 发起的,因此涉及到一些 crossdomain.xml 文件的配置。

但是这些所有的操作都依赖于和运行在HttpServer之中的,这种方式是无法满足,把这个上传功能模块集成到项目的工程之中的,因为您的项目之中无法接受你运行一个独立的HttpServer服务的。

3、真实项目使用方式(集成到项目之中提供API获得STS授权)

于是只能另外寻找其他方式,希望通过写一个普通的接口,然后前端能够直接调用后台的接口API。

实现STS授权文件上传的具体业务流程

3.1、后端提供一个生成STS授权服务的接口(重点注意事项:后端提供的STS获得接口必须支持JSONP的否则前端无法实现文件上传),

3.2、前端直接访问接口获得相关的STS授权信息,由于授权可以设置权限的时效性,于是乎需要考虑sessionToken过期的情况,需要前端上传文件之前判断获得STS是否在有效期内。

在下想过很多之种方法,最后甚至询问了兄弟单位,他们使用的PHP方式来实现的文件上传,然后获得临时授权,甚至请求他们给了部分实现如何获得STS授权的源码如下图所示:

百度后端PHP生成STS

260696?pageNo=1

758c43f6d1628c7e8777d38d33c5a3a8.png

3、百度云点播VOD服务,使用STS方式上传文件基本使用ES6前端编码实现上传

return api.getToken().then((data) => {

this._tokenTime = +new Date() + expireMs;

return this.client = new baidubce.bos.Uploader({

bos_bucket: data.bucket || this.bucket,

bos_endpoint: this.endPoint,

bos_ak: data.accessKeyId,

bos_sk: data.secretAccessKey,

uptoken: data.sessionToken,

bos_task_parallel: 1,

init: init

});

});

在添加文件之前判断_tokenTime < 当时时间

this.client.setOptions({   bos_ak: data.accessKeyId,

bos_sk: data.secretAccessKey,

uptoken: data.sessionToken

}); 更新token

返回结果 如果前端需要处理 建议过期时间格式为 2018-01-26 22:45:00

{"bucket":"***",//返回你自己的bucket"accessKeyId":"6dc9c09800b111e8bec5dd8bafa1b8e0","secretAccessKey":"0042398f67ce4508b4f3cef87c634f7e","securityToken":"MjUzZjQzNTY4OTE0NDRkNjg3N2E4YzJhZTc4YmU5ZDh8AAAAAFoBAADkQOwuM8FBxyU6ZaFwkS9bF7VgK9LM+9JS1HdiZAEGOmDjFD9d8IrR5mktyfagQVw2I5M3Fy0icAUK8kwgzVRpNWMmlImJL9T1RHWTDzqvBvgbXAfQXOUwF/SEP0QgN3aihA6+0MgHLkFjR1kXKe4EeNsQAO9Ut00mL8h/MCoWo0BdhcGOGVYbje7f+vl09pXWycYVcYqjmjPLqmuoEQ0GuHPr1/j6WpTjvdJsiSx4Qe0/y21S5LxHdk+dqXofnoUiTWPi8mh7/bCHmgDoA0NT8TBquKuWGQdETayCEklYIQ==","expiresAt":"Wed Jan 24 22:51:08 CST 2018"}

虽然有了兄弟单位提供基本示例,但是没有参透其中的玄机;还是不明白如何能够不通过运行HttpServer,通过接口方式直接获得STS相关的授权信息。最后仔细阅读了示例之中uploader之中的必选参数,如下图所示

5a851020-c8bd-4da5-9787-4f492569d179.gif

42366ba23293f087a1fcd10368bba14f.png

然后参照提供示例的后端Java实现代码,把后端改造为如下方式

186faa7a-b843-49a2-b2be-7265158d72ad.gif

4d8636ef81f083813562eec047548557.png

特别注意 其中里面后端代码支持JSONP模式的关键点参数 callback

如果理解透彻这一点,您在你的项目之中能够实现基本的API就可以获得百度云提供STS授权认证模式。然后在分析兄弟单位提供的PHP其实也是实现JSONP的方式。然后本人也特意在网上收集如何在服务端支持JSONP如下文件链接

1313c6e2-b224-41ef-a721-cfcc7669d6ca.gif

140b138758e34920187fed7ae1e2ef09.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 3507 Print Article(斜率优化DP)

题目链接&#xff1a;hdu 3507 Print Article 题意&#xff1a; 每个字有一个值&#xff0c;现在让你分成k段打印&#xff0c;每段打印需要消耗的值用那个公式计算&#xff0c;现在让你求最小值 题解&#xff1a; 设dp[i]表示前i个字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服务注册与服务查询

1、定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法。 关于服务的定义&#xff1a;服务的属性我们会在后边每出现一个总结一个&#xff0c;最后再做总结。 2、服务注册 2.1、创建服务文件所存放的文件夹 说明&#xff…

coreos 安装mysql_CoreOS 在 PC 上快速安装方法指南

意义能够以最快的速度安装部署Linux操作系统。安装快速简单&#xff0c;几乎不花时间就可以开始运行Docker。运行速度非常快。使用内存硬盘。我的情况win8 笔记本偶尔玩游戏&#xff0c;但是装Linux双系统可能需要我一天的时间来完成。我的所有业务都只需要在Docker中跑就可以了…

Session 的配置和特性

session的配置 对于session的配置是php.ini中配置 session数据都是保存在文本文件中 设置session文件的保存位置 说明&#xff1a; 默认是保存在windows/temp目录 设置session保存作为客户端标识的数据使用cookie 设置session保存客户端标识的数据&#xff0c;只使用cookie 说明…

OAuth与Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 开放式身份验证 &#xff09;是一种开放式身份验证标准。 它允许用户与其他站点共享存储在一个站点上的私有资源&#xff08;例如照片&#xff0c;视频&#xff0c;联系人列表&#xff09;&#xff0c;而不必发出其凭据&#xff…

UIViewController生命周期

UIViewController生命周期 UIViewController生命周期 posted on 2016-04-07 20:15 相而勿绝 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/fmdxiangdui/p/5365249.html

众筹源码 php,助创cms众筹源码系统v1.0

什么是助创cms众筹系统?使用“预约团购”的众筹方式给自己的创意争取大家的关注和支持&#xff0c;是近年来非常火热的一种融资模式&#xff0c;助创cms众筹系统可以10分钟帮你打造一个和京东众筹一样的平台&#xff0c;包含产品众筹和公益众筹两个部分&#xff0c;可以直接拿…

69 个经典 Spring 面试题和答案

Spring 概述 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发&#xff0c;并通过POJO为基础的编程模型促进良好的编程习惯。使用Spring框架…

高性能MySql

1、索引是对DB优化最有效的方式 varchar(10)定义的是字符的个数&#xff0c;如果是utf-8的话&#xff0c;最大是3X10个字节 二、索引类型 1、MySql的索引是在存储引擎层实现的&#xff0c;各个存储引擎的的索引方式也是不同的 2、B-Tree索引 MyISAM索引通过数据的物理位置引用被…

Java Swing井字游戏

大家好&#xff01; 哇&#xff0c;自从我在这里发布了东西以来已经有一段时间了&#xff01; 我必须说我真的很想写东西&#xff0c;而且我保证我不会再陷入“作家的障碍”。 希望 ..最近两个月发生了很多事情&#xff0c;我有很多话要说。 但是在这篇文章中&#xff0c;我只是…

event php,PHP event 事件机制

/** PHP 事件机制*/class baseClass{private $_e;public function __set($name,$value){if( strncasecmp($name,"on",2) 0 ){if(!isset($this->_e[$name]))$this->_e[$name] array();return array_push($this->_e[$name] , $value);}}public function __g…

Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

版权声明&#xff1a;本文出自阿钟的博客&#xff0c;转载请注明出处:http://blog.csdn.net/a_zhon/。 目录(?)[] 一&#xff1a;什么是静态内存什么又是动态内存呢&#xff1f; 静态内存&#xff1a;是指在程序开始运行时由编译器分配的内存&#xff0c;它的分配是在程序开始…

配置MyBatis 3

MyBatis是一个非常流行且也是最有效的SQL映射框架。 MyBatis可用于Java和.net语言。 MyBatis并不是Hibernate的真正替代品&#xff0c;但是我们可以使用该框架来减少MyBatis提供的高效和高性能的数据库相关代码。 本教程将向您展示使用数据库配置MyBatis 3的步骤。 MyBatis 3支…

java中datetime类型转换,Java中日期格式和其他类型转换详解

涉及的核心类&#xff1a;Date类、SimpleDateFormat类、Calendar类一、Date型与long型Date型转换为long型Date date new Date();//取得当前时间Date类型long date2long date.getTime();//Date转longlong型转换为Date型long cur System.currentTimeMills();//取得当前时间lon…

GWT MVP变得简单

GWT Model-View-Presenter是用于大规模应用程序开发的设计模式。 它源于MVC&#xff0c;它在视图和逻辑之间进行划分&#xff0c;并有助于创建结构良好&#xff0c;易于测试的代码。 为了帮助像我这样的懒惰开发人员&#xff0c;我研究了如何减少使用声明式UI时要编写的类和接口…

今年计划要看的书全部备齐

上个月购买的书《今年计划看的书其中几本》 http://www.cnblogs.com/insus/p/5325513.html 昨天购买的书回来了&#xff0c;今年计划要看的书全部备齐。《MongoDB》&#xff0c;《深入理解Bootstarp》和《ASP.NETSignalR编程实践》…… 转载于:https://www.cnblogs.com/in…

图形教程

众所周知&#xff0c;我们可以借助Java库制作游戏&#xff0c;这些库为我们提供制作游戏所需的图形。 因此&#xff0c;今天我将开始一个关于Java图形的非常新的部分。 我之前曾发表过有关如何制作所得税计算器的文章 。 首先要满足一些先决条件&#xff1a; -您应该对Java语法…

向导设计模式

我们都喜欢巫师……。 &#xff08;我的意思是软件向导&#xff09;。 我们总是很高兴跳上那些“下一步”按钮&#xff0c;就像我们在我们的时髦的小鸡上跳舞一样。 因此&#xff0c;今天我们将您心爱的向导带入您的编码经验中。 让我们跳入一个例子。 假设您要设计一个Conserv…

Flex 布局教程:语法篇

网页布局&#xff08;layout&#xff09;是CSS的一个重点应用。 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便&#xff0c;比如&#xff0c;垂直居中就不容易实现。 2009年&#xff0c;W3…

JavaFX 2中的PopupMenu

创建弹出菜单 要在JavaFX中创建Popupmenu&#xff0c;可以使用ContextMenu类。 您向其中添加MenuItems&#xff0c;也可以使用SeparatorMenuItem创建可视分隔符。 在下面的示例中&#xff0c;我选择子类ContextMenu并将MenuItems添加到其构造函数中。 public class Animatio…