ruby on rails aliyun 视频点播上传

2024-03-12 20:08

本文主要是介绍ruby on rails aliyun 视频点播上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

签名请看: https://blog.csdn.net/tang05709/article/details/88366228 

module Aliyunclass AliyunVideoAchieve < AliyunSigndef initialize@access_key_id = Rails.configuration.application['ALIYUN_OSS_ACCESS_KEY_ID']@access_key_secret = Rails.configuration.application['ALIYUN_OSS_ACCESS_KEY_SECRET']@send_url = 'http://vod.cn-shanghai.aliyuncs.com'.freezeend'''获取视频上传地址和凭证,并创建视频信息title: 视频标题file_name: 视频源文件名必须带扩展名options: FileSize: 视频文件大小; Description: 视频描述,长度不超过1024个字节, CoverURL:自定义视频封面URL地址options: CateId:视频分类ID;Tags:视频标签,多个用逗号分隔;TemplateGroupId:转码模板组ID; UserData:自定义设置,为JSON字符串,支持消息回调等设置options: StorageLocation:存储地址。当不为空时,会使用该指定的存储地址上传视频文件return RequestId:请求ID; VideoId:视频ID;UploadAddress:上传地址;UploadAuth:上传凭证'''  def create_upload_video(title, file_name, options = {})#http://vod.cn-shanghai.aliyuncs.com/?Action=CreateUploadVideo&Title=exampleTitle&FileName=example.avi&FileSize=10485760&Format=JSON&<公共参数>#Action 系统规定参数。取值:CreateUploadVideo#Title视频标题,长度不超过128个字节 utf8#FileName视频源文件名必须带扩展名,且扩展名不区分大小写。MP4,3GP,MPEG,AVI,FLV,m3u8#FileSize 视频文件大小# 返回 RequestId:请求ID, VideoId:视频ID, UploadAddress:上传地址, UploadAuth:上传凭证param = {Action: 'CreateUploadVideo',Title: title,FileName: file_name,AccessKeyId: @access_key_id}key = @access_key_secret + '&'options = create_sign_url("POST", param, key, 'video')result = Faraday.post(@send_url, options)res = JSON.parse(result.body)if res["UploadAddress"].blank? []else resend end'''刷新视频上传凭证video_id 视频ID'''def refresh_upload_video(video_id)# http://vod.cn-shanghai.aliyuncs.com/?Action=RefreshUploadVideo&VideoId=93ab850b4f6f44eab54b6e91d24d81d4&Format=JSON&<公共参数># Action 系统规定参数。取值: RefreshUploadVideo# VideoId 视频ID# 返回 RequestId:请求ID, UploadAddress:上传地址, UploadAuth:上传凭证param = {Action: 'RefreshUploadVideo',VideoId: video_id,AccessKeyId: @access_key_id}key = @access_key_secret + '&'options = create_sign_url("POST", param, key, 'video')result = Faraday.post(@send_url, options)res = JSON.parse(result.body)if res["UploadAddress"].blank? []else resend endend
end

表单

class VideoMediaInput < SimpleForm::Inputs::Basedef input(wrapper_options = nil)# 获取data属性data = options[:data] || {}class_name = self.class.name.underscore.dasherize# [link, spinner, hidden, list_panel].join&.html_safetemplate.content_tag(:div, class: "media #{class_name} video-media-picker") do# 获取值value = object.send(attribute_name)value_v = value.to_json if value.is_a?(Array)# 上传按钮picker_button = content_tag :div,'',class: 'button media-picker-button',id: attribute_name.to_s + '_uploader',data: datatemplate.concat picker_button# file表单picker_file = content_tag :input, '',  class: "media-picker-file", type: 'file',accept: 'video/*'template.concat picker_file# 隐藏域input_field = @builder.hidden_field(attribute_name, value: value_v)template.concat input_fieldendendend

前端

# 生成文件名称
random_string = () ->chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'pwd = ''for num in [1..28]pwd += chars.charAt(Math.floor(Math.random() * chars.length))return pwd# 获取后缀并重新命名文件
get_new_file_name = (file) -> pos = file.lastIndexOf('.')new_file_name = ''if (pos != -1)?file_name = random_string()suffix = file.substring(pos)new_file_name = file_name + suffixreturn new_file_name# 获取凭证
get_video_sign = (title, file_name, uploadInfo, uploader) -> $.post("/xxx", { title: title, 'file_name': file_name},(data) -> if(data)  # 从点播服务获取的uploadAuth、uploadAddress和videoId,设置到SDK里uploader.setUploadAuthAndAddress(uploadInfo, data.UploadAuth, data.UploadAddress, data.VideoId))# 刷新凭证
get_refresh_video_sign = (uploadInfo, uploader) ->$.post("/xxx", { video_id: uploadInfo.videoId},(data) -> if(data)uploader.setUploadAuthAndAddress(uploadInfo, data.UploadAuth, data.UploadAddress, uploadInfo.videoId))# 超时刷新凭证
get_expired_video_sign = (videoId, uploader) ->$.post("/xxx", { video_id: videoId},(data) -> if(data)uploader.resumeUploadWithAuth(data.UploadAuth))# 进度条
progress_template = (loadedPercent) ->percentage = Math.ceil(loadedPercent * 100) + "%"return "<div class='progress-box'><div class='progress'></div><div class='progress-value'>#{percentage}%</div></div>"# 显示视频
success_template = (file_name) ->return "#{file_name}上传成功,请等待转码,依据视频大小大约1-10分钟。"# 上传失败
fail_template = () ->return "<li>上传失败</li>"$(document).on 'turbolinks:load', ->upload_init = (el, video) ->title = video.namefile_name = get_new_file_name(title)uploader = new AliyunUpload.Vod({# 阿里账号ID ,值的来源https://help.aliyun.com/knowledge_detail/37196.htmluserId: "1663930772708781",# 上传到点播的地域, 默认值为'cn-shanghai',//eu-central-1,ap-southeast-1region: "cn-shanghai",# 分片大小默认1M,不能小于100KpartSize: 1048576,# 并行上传分片个数,默认5parallel: 5,# 网络原因失败时,重新上传次数,默认为3retryCount: 3,# 网络原因失败时,重新上传间隔时间,默认为2秒retryDuration: 2,# 开始上传'onUploadstarted': (uploadInfo) ->if (uploadInfo.videoId)#如果 uploadInfo.videoId 存在, 调用 刷新视频上传凭证接口(https://help.aliyun.com/document_detail/55408.html)data = get_refresh_video_sign(uploadInfo, uploader)else #如果 uploadInfo.videoId 不存在,调用 获取视频上传地址和凭证接口(https://help.aliyun.com/document_detail/55407.html)data = get_video_sign(title, file_name, uploadInfo, uploader)# 文件上传成功'onUploadSucceed': (uploadInfo) -># 获取值input_field = el.find('input[type=hidden]')input_field.val(uploadInfo.videoId)html = success_template(uploadInfo.object)el.next('small').find('.image-list ul').html(html)# 文件上传失败'onUploadFailed': (uploadInfo, code, message) ->html = fail_template()el.next('small').find('.image-list ul').html(html)# 文件上传进度,单位:字节'onUploadProgress': (uploadInfo, totalSize, loadedPercent) ->html = progress_template(loadedPercent)el.next('small').find('.image-list ul').html(html)# 上传凭证超时'onUploadTokenExpired': (uploadInfo) ->data = get_expired_video_sign(uploadInfo.videoId, uploader)# 全部文件上传结束'onUploadEnd': (uploadInfo) ->console.log('onUploadEnd')})uploader.addFile(video, null, null, null, '')uploader.startUpload()$('.video-media-picker').each ->el = $(this)file_obj = $(this).find('.media-picker-file')file_obj.change (event) ->video = event.currentTarget.files[0]if video.name != 'undefined' && video.size < 157286400upload_init(el, video)

当然需要引入相应的js

把js加载下来放在app/assets/javascripts目录下, 然后引入

//= require aliyun_video/lib/es6-promise.min.js
//= require aliyun_video/lib/aliyun-oss-sdk-5.3.1.min.js
//= require aliyun_video/aliyun-upload-sdk-1.5.0.min.js

 

这篇关于ruby on rails aliyun 视频点播上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802428

相关文章

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

在SSH的基础上使用jquery.uploadify.js上传文件

在SSH框架的基础上,使用jquery.uploadify.js实现文件的上传,之前搞了好几天,都上传不了, 在Action那边File接收到的总是为null, 为了这个还上网搜了好多相关的信息,但都不行,最后还是搜到一篇文章帮助到我了,希望能帮助到为之困扰的人。 jsp页面的关键代码: <link rel="stylesheet" type="text/css" href="${page

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

使用http-request 属性替代action绑定上传URL

在 Element UI 的 <el-upload> 组件中,如果你需要为上传的 HTTP 请求添加自定义的请求头(例如,为了通过身份验证或满足服务器端的特定要求),你不能直接在 <el-upload> 组件的属性中设置这些请求头。但是,你可以通过 http-request 属性来自定义上传的行为,包括设置请求头。 http-request 属性允许你完全控制上传的行为,包括如何构建请求、发送请

Vue3图片上传报错:Required part ‘file‘ is not present.

错误 "Required part 'file' is not present" 通常表明服务器期望在接收到的 multipart/form-data 请求中找到一个名为 file 的部分(即文件字段),但实际上没有找到。这可能是因为以下几个原因: 请求体构建不正确:在发送请求时,可能没有正确地将文件添加到 FormData 对象中,或者使用了错误的字段名。 前端代码错误:在前端代码中,可能

aliyun图片存储OSS工具类

pom.xml配置jar包 <!-- oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency> yml配置相关key #oss 配置oss:#AKaccessKey: accessKey

【SpringMVC学习06】SpringMVC中实现文件上传

1. 环境准备 springmvc上传文件的功能需要两个jar包的支持,如下 2. 单个文件的上传 2.1 前台页面 简单的写一下前台页面,注意一点的是form表单中别忘了写enctype=”multipart/form-data”属性: <tr><td>商品图片</td><td><c:if test="${itemsCustom.pic !=null}"><img src="/f

使用Vant Uploader 文件上传,后端java中MultipartFile接收不到文件问题解决

问题 在Uploader组件 after-read回调函数将获取的file对象上传到服务器。 <van-uploader:after-read="uploadFile"/>uploadFile(file) {const data = new FormData();data.