七牛 persistent微信notify url设置url 怎么设置

收藏,1.1k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
各位,请问文档中persistentNotifyUrl没有指明携带什么数据,在callbackbody中设置还是?我在里面测试发现回调时并没有接收到数据~求解惑~~
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
通知的内容在文档中有示例:
由于Content-Type为application/json,因此在接受通知时需要获取请求的body。
以php为例,$_POST是无法获取的,需要
$NotifyData = file_get_contents("php://input");
可以参考:
其他语言/框架也是类似的。
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要举报该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知七牛云试用指南-音视频基本处理_小组_ThinkSAAS
七牛云试用指南-音视频基本处理
七牛云试用指南-音视频基本处理
对于音频、视频等多媒体资源,七牛云也提供了丰富的处理指令,包含但不限于以下指令:
本篇从获取音视频元信息入手,顺序讲解各个处理指令。
■ 获取音视频元信息
使用可以非常方便地获取一个音视频资源的相关元信息:
http://&Bucket&./&Key&?avinfo
http://&Domain&/&Key&?avinfo
以美剧(flv资源)为例,在浏览器中打开如下URL:
http://qiniu-developer./samples/黑名单-S01E12.flv?avinfo
将返回一个JSON格式组织的元信息对象:
"streams": [
"index": 0,
"codec_name":"h264",
"codec_long_name":"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"codec_type":"video",
"codec_time_base":"",
"codec_tag_string":"avc1",
"codec_tag":"0x",
"width": 1280,
"height": 720,
...省略过长内容...
"index": 1,
"codec_name":"aac",
"codec_long_name":"Advanced Audio Coding",
"codec_type":"audio",
"codec_time_base":"1/44100",
"codec_tag_string":"mp4a",
"codec_tag":"0x6134706d",
"sample_fmt":"s16",
"sample_rate":"44100",
"channels": 2,
...省略过长内容...
"format": {
"nb_streams": 2,
"format_name":"mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name":"QuickTime/MPEG-4/Motion JPEG 2000 format",
"start_time":"0.000000",
"duration":"29.070000",
"size":"8702170",
"bit_rate":"2394818",
"major_brand":"mp42",
"minor_version":"0",
"compatible_brands":"isommp42",
"creation_time":" 08:43:21"
可以看到音频、视频和封装格式信息被准确地描述出来。
■ 基本音视频处理
支持的基本音视频处理包括:
转换编码(如h264转x264,mp3转aac);
转换封装格式(如flv转mp4)
截取片段;
修改编码码率;
修改分辨率。
以前文的flv资源为例,若只想简单地转码为mp4格式,可以使用如下URL达成目的:
黑名单-S01E12.flv?avthumb/mp4
接收到这样的请求后,七牛云将对指定资源执行实时转码操作,缓存结果后将新资源返回给请求端。点击查看。
avthumb接口是同步接口,如原资源过大,将导致访问端超时返回,强烈建议使用或进行预处理,加快访问速度;
为加快访问速度,转码后的结果还将被七牛云缓存起来,不计入存储空间,节省计算资源,过期失效后会重新触发计算。
■ 预转持久化处理
上传时,通过在中指定persistentOps字段的值,可以触发七牛云对上传资源进行指定的数据处理。还可以同时指定persistentNotifyUrl字段的值,以便将及时通知给业务端处理。
以前文的flv资源为例,若想预先转换成mp4格式并持久存储结果(计入存储空间),可以使用以下两个Ruby程序来完成。
[简易HTTP服务器] 接收预转持久化处理的结果,并将状态信息打印到终端上:
#!/usr/bin/env ruby
# encoding : utf-8
# persistent_notify_server.rb
require 'json'
require 'xmlrpc/httpserver'
class PersistentNotifyHandler
@@count = 0
def ip_auth_handler(io)
# 任何请求都允许处理
return true
end # ip_auth_handler
def request_handler(request, response)
# 读取请求报文
body = request.data.read_nonblock(65536)
# 重新格式化JSON对象
json = JSON.generate(
JSON.parse(body),
indent: ' ',
object_nl:"n",
array_nl:"n",
@@count += 1
# 构造响应报文(可选)
response.body = 'OK'
end # request_handler
def self.count()
return @@count
end # self.count
end # PersistentNotifyHandler
svr = HttpServer.new(
PersistentNotifyHandler.new(), # 请求处理器
9090, # 端口
'0.0.0.0' # 监听IP
while (PersistentNotifyHandler.count() == 0)
puts 'waiting for notification...'
svr.shutdown
[HTTP客户端] 上传flv文件并触发预转持久化处理:
#!/usr/bin/env ruby
# encoding : utf-8
# put_flv_file.rb
require 'json'
require 'net/http'
require 'base64'
require 'openssl'
# 根据传入参数,构造一个上传策略(触发预转持久化处理)
def put_policy(bucket, expires, persistentOps, persistentNotifyUrl)
# 生成一个Hash对象
put_policy = Hash.new()
# 仅指定目标存储空间,即“新增资源”语意:
# 资源不存在则创建
# 资源已存在,且与上传内容不一致则失败
put_policy['scope'] ="#{bucket}"
# 计算授权有效期截止时间,UNIX时间戳格式
put_policy['deadline'] = (Time.now() + expires).tv_sec()
# 指定预转持久化处理的指令
put_policy['persistentOps'] = persistentOps
# 指定预转持久化处理的结果通知URL
put_policy['persistentNotifyUrl'] = persistentNotifyUrl
# 序列化为JSON字符串
return JSON.generate(put_policy)
end # put_policy
# 根据传入的上传策略,生成对应的上传授权凭证
def upload_token(access_key, secret_key, put_policy)
# 对上传策略做UrlSafe-Base64编码
encoded_put_policy = Base64.urlsafe_encode64(put_policy)
# 使用SHA1作为HASH函数,生成签名
sign = OpenSSL::HMAC.digest(
secret_key,
encoded_put_policy
# 对签名做UrlSafe-Base64编码
encoded_sign = Base64.urlsafe_encode64(sign)
# 拼出上传授权凭证,以“:”作为分隔符
return"#{access_key}:#{encoded_sign}:#{encoded_put_policy}"
end # upload_token
BUCKET = 'qiniu-ts-demo' # 使用时请更换成真实的存储空间名
EXPIRES = 3600
ACCESS_KEY = 'MY_ACCESS_KEY' # 使用时请更换成真实的AccessKey
SECRET_KEY = 'MY_SECRET_KEY' # 使用时请更换成真实的SecretKey
PERSISTENT_OPS = 'avthumb/mp4' # 持久化处理指令
PERSISTENT_NOTIFY_URL = ':9090' # 使用时请更换成真实的域名和端口
# 生成上传授权凭证
upload_token = upload_token(
ACCESS_KEY,
SECRET_KEY,
put_policy(
PERSISTENT_OPS,
PERSISTENT_NOTIFY_URL
# 指定请求报文中的各个参数
file_name = '黑名单-S01E12.flv' # 使用时请更换成真实的文件
file_content = File.open(file_name, 'rb') do |fh|
puts 'file size is %s' % file_content.size
boundary = 'a-string-never-exists-in-the-uploading-file'
# 生成请求报文体
req_body = &&HTTP_BODY
--#{boundary}
Content-Disposition: form- name="token"
#{upload_token}
--#{boundary}
Content-Disposition: form- name="key"
#{file_name}
--#{boundary}
Content-Disposition: form- name="file"; filename="#{file_name}"
Content-Type: video/x-flv
Content-Transfer-Encoding: binary
# 转换换行符
req_body.gsub!(/n/,"rn")
req_body = req_body.force_encoding('ASCII-8BIT') + file_content +"rn--#{boundary}--rn"
# 生成Headers
req_headers = Hash.new()
req_headers['Host'] =""
req_headers['Content-Type'] ="multipart/form- boundary=#{boundary}"
req_headers['Content-Length'] ="#{req_body.size}"
# 发送请求
http_client = Net::HTTP.new('', 80)
resp = http_client.post(
req_headers
# 解析响应
puts"HTTP Code=#{resp.code}"
puts"HTTP Msg=#{resp.msg}"
puts"HTTP Body=#{resp.body()}"
先启动服务器,然后执行上传程序,等待一段时间后便可收到预转成功的通知结果:
[Mon Jan 20 19:10:19 2014] HttpServer 0.0.0.0:9090 client:8.138.231&115.238.138.231& connect
"id":"16i99r7gjlrc8r9213",
"desc":"The fop was completed successfully",
"cmd":"avthumb/mp4",
"desc":"The fop was completed successfully",
"error":"",
"hash":"lpqijRaQ4c_CPoKDL1bLWK7TUoI3",
"key":"UAA-4hndfVc5V6DJX0EvslAUBBI=/ll8spobyuu_F112ZWyG6Va4qk4Ch"
[Mon Jan 20 19:10:19 2014] HttpServer 0.0.0.0:9090 client:39573 disconnect
[Mon Jan 20 19:10:52 2014] HttpServer 0.0.0.0:9090 stop
其中,Key字段给出持久化的mp4资源的名字,即可以通过如下URL访问转换好的mp4视频:
http://qiniu-ts-/UAA-4hndfVc5V6DJX0EvslAUBBI=/ll8spobyuu_F112ZWyG6Va4qk4Ch
点击查看。
■ 咱们行进到哪儿了?
通过三个实例,初步讲解了音视频处理的基本接口(avinfo/avthumb),读者应该有能力自行编程实现上传与触发预转持久化处理。
(C) 2014 署名-非商业性使用-禁止演绎
允许自由转载,请注明作者及出处。
PHP开发框架
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。微支付 notify url - 网络技术编程
微支付 notify url
据国外媒体报道,eBay旗下的在线支付平台PayPal今天在其开发者年会上发布了微支付产品. 该公司在新闻稿中称,新产品是一种“基于网页内容的支付解决方案,消费者最少只需要点击两次鼠标,即可在不离开游戏.新闻.音乐或视频页面的状态下为数字商品和内容付款”. 该系统的收费标准是交易额的5%,交易额在12美元以下的需另加5美分.PayPal称,这一标准比其他支付系统更低.例如,按照PayPal的标准定价,一笔1美元的交易的手续费为0.33美元:而在微支付系统中,这笔交易的收费仅为0.10美元. Pa
上周我们报道过新浪微博的支付系统即将上线,可能与新版新浪微博一起.今天,微支付已经正式上线,但是是与新浪微博游戏平台 - 微游戏 - 一起上线.从微游戏首页看到,第一期上线的游戏一共有6款,包括在各个平台都很受欢迎的德克萨斯扑克.血拼斗地主等.在游戏界面的侧边栏,已经可以看到“查看余额”和“去充值”的链接,点击则可以进入微支付的页面.在这个页面,微币的概念和用途已经有了官方说明:概念:由微博平台发行的虚拟货币,可用于在线支付.用途:可用于购买微博提供的各种虚拟商品和增值服务. 微支付首期将只与微
新浪微博今天正式推出了游戏平台 – 微游戏和支付平台 – 微支付.用户可以通过微支付系统充值微币购买游戏内的虚拟物品.新浪表示未来微支付系统还将整合更多微博产品.与微博的始祖Twitter不同,新浪微博似乎更在走世界最大的社交网站Facebook的路线.Twitter上的付费帐户推广与付费趋势推广有望在2011年为其带来1.5亿美元的收入,但新浪微博似乎并不打算这样走.DoubleClick前CEO Kevin Ryan预计Facebook在2011年可通过社交游戏获得10亿美元收入,而这10亿
&&&1&条回复
选用云适配技术,我们也有微信支付的服务啊? 您好,目前微信只对少数合作伙伴网站开通微信支付接口,网站所有者需自行与微信商务部门联系开通
据国外网站报道,Internet Analyst最近发表报告称,在与多家虚拟商品和社交游戏公司谈论Facebook最近引入的支付平台后,他们发现:·最初测试结果显示,消费者在替代支付选项中还是选择了Facebook的新支付系统.·Facebook向出版商收取30%的费用,而其他与之竞争的服务多数只按照10%以下收取.·对今年收入的影响可能达到1..5亿美元甚至更多,前提是正式发布后还能保持测试时的结果.·长期目标是追随PayPal,成为通用在线支付系统.Facebook的支付系统为用户提
微信支付是由微信及财付通联合推出的移动支付创新产品.如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑.本文将结合微信支付接口开发的实践,从支付申请到各主要接口的使用方法等方面介绍微信支付的关键点技术.URL设置目前,微信支付只能由通过微认证的服务号进行申请,订阅号及未认证的服务号均无法申请.登录微信公众平台后台,在左侧的栏目中可找到“微信支付”,点击进入申请界面,可以看到第一项中的“商户基本资料”,点击右侧的“填写”按钮后就进入了
redirect_url参数错误: 报这个错误,说明你的公众号后台授权设置有问题(一般有两处) 一:检查授权目录 答:支付授权目录是网站发起请求的页面所在目录,并且必须是能通过url地址访问的(与真实物理目录路径无关).注意这个目录在注册填写时,需要精确到最细一级的且使用名称后直接加文件名,不可再增加 or 删减目录. 二:检查网页授权 当开发者使用微支付的“JS API”支付时,这种支付需要网页授权,先获取code,再拿code去获取openid和prepay_id.这个网页授权需要登录微信公
&&&2&条回复
比如我项目发起支付的URL是 /pay/weixinpay.html 是用THinkPHP写的,那么微信支付授权目录如何填写呢? 以下目录配置我都试过没有用./index.php//index.php/pay//index.php/pay/weixinpay.html/App/Home/View/Pay/ 根
&&&1&条回复
使用的是微信原生支付. 支付回调URL 填的是这种类型的url http://域名/pay/create/native/package.do 不知道问题出在哪里. 一般情况下出现这个问题是因为微信服务器过载了,你可以稍后试一下. 如果稍后常识还是存在问题,可以检查是否有敏感操作和违规行为. 希望能够帮到你,如有疑问请咨询.
据国外媒体报道,eBay首席执行官约翰·多纳霍(John Donahoe)称,Facebook不会开发自己的支付平台与eBay旗下的支付平台PayPal竞争. 多纳霍认为,PayPal“技术深奥”,很难被效仿.由于Facebook正忙于与银行交涉.建立欺诈防护体系以及应对其他挑战,这一全球最大的社交网站没有精力去开发支付平台. 目前,PayPal为Facebook上的微支付交易提供支持.多纳霍并未给出这一市场的具体规模,但表示其规模将会十分庞大. 多纳霍表示,PayPal将是Facebook“基
前段时间,在微博上,就,接收了&通信信息报&记者廖剑锋的采访,问到了如何看待新浪微博推出微币这个事情.下面是我通过微博的私信做的回答,发出来,供讨论.廖剑锋根据我的回答,结合其他两位专业人士的观点,做了一个评论报道,见&上半年微博用户数暴涨两倍 专家称价值需借商业化体现&. 问:前段时间,曹国伟说,不着急微博盈利.但是现在就推出微币.你怎么看待这件事呢? 1.不着急盈利,这是事实,因为暂时也不容易盈利.不着急盈利,并不表示不要找商业模式.广告,已经在做了.社会化营销,也有各种团队在
艾瑞咨询分析师蒋李鑫今日发布&2009年第三季度中国网上支付市场监测报告&简版报告称,2009年第三季度网上支付市场交易额规模达1560亿元,环比上涨26.2%,同比上涨117.3%. 根据艾瑞咨询即将发布的&2009年第三季度中国网上支付市场监测报告&研究显示,2009年第三季度网上支付市场交易额规模达1560亿元,环比上涨26.2%,同比上涨117.3%.艾瑞分析认为,网上支付顺势高增受益于中国经济的回暖和电子商务的不断推进.考虑到09Q4网购旺季的到来,网上支付全年交易规模有
昨天客户向我提到,微信支付在IOS上成功,但在Android上会报system:access_denied错误. 反复检查代码,没有问题.而且因为IOS上成功支付,让我百思不得其解,为什么Android上不成功. 后来看到一篇文章/post/9/wechat-pay-system-access-denied/,反应的问题和我一样,但是没有提到解决方法. 各种调试.各种办法,没有解决. Android总结如下情况: 从微信公众号界面,直接访问支付页面,成功支
ECSHOP 微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 申请微信支付手机版部分时需要填写的配置接口地址: 1.在微信公众平台设置好支付授权目录. http(s)://域名/mobile/
支付请求实例:http(s)://域名/mobile/weixin/open-api.php 2.维权通知URL:http(s)://域名/mobile/weixin/wxpay_activists_r
关键字:微信支付 微信支付v3 native支付 统一支付 Native支付 prepay_id 作者:方倍工作室原文: /txw1958/p/wxpayv3-native-static.html
本文介绍微信支付下的基于静态链接二维码的Native支付实现流程. 注意 微信支付现在分为v2版和v3版,号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数.v2的相关介绍请参考方倍工作室的其他文章.
点评;浪新的微币将会对中国的互联网生态圈产生重大影响,电子商务,团购,招聘,同城服务7月14日消息,据消息人士透露,浪新将在今年第三季度推出微博虚拟货币&微币&,这将成为为该平台首次真正的货币化行动. 业界人士认为,浪新推出虚拟货币的计划对于拥有1.4亿用户的浪新微博来说可谓发展中关键的一步,预计产生重大影响. 对于媒体的报道,浪新官方还没有就此消息作出回应,但浪新最近在提供给第三方应用开发商的一份文档中给出了&微支付&的概念. 据透露,微币将包括等同于1元人民币
&微赢微信公众平台系统5月14最新破解高级运营版+水果机+邀请函+微汽车+微食品+用户CRM& 此版本目前是淘宝卖600RMB的,其它VIP源码论坛也都还没有发布,咱们这里完全免费分享出来,但这里先说明下,别拿回去叫着安装不了,这套微赢微信公众平台系统5月14最新破解高级运营版需要在php 5.4版本下面才能安装,目前一般的虚拟主机都无法正常安装. 非常感谢分享此套源码的童鞋,希望更多的童鞋能分享好的资源. 下面是我们亲测截图 微赢高级版正式上线,支持后台一键更新升级.高级版新功能:新版商城,
App支付流程: 本篇随笔只实现红框内的两个功能:生成预支付Id,生成app支付参数 1 /// &summary& 2 /// App 预支付 3 /// &/summary& 4 /// &returns&&/returns& 5 public ActionResult AppPrePay() 6 { 7 string orderNo = &&; //订单编号,文档中的out_trade_no 8 string description
原文:微信原生支付 Native扫码支付( V3.3.7 版本) [尊重别人的劳动成果,转载请注明出处:一缕晨光工作室,] 前言 辛苦研究三天,遇到各种困难,最终还是克服了,把我的理解和思路分享给需要帮助的人,如果你觉的好,请帮我分享一下,谢谢. 在没有做之前,我以为和支付宝,以及银联一样,会在官网找到相应的demo,照葫芦画瓢即可,没有什么复杂的,真正去做的时候,发现各种错误,很多时候都莫名其妙找不到北, 在网上搜了不知道多少遍,有V3版的,不过都是js api
[java] view plaincopyprint? &span style=&font-family: Arial, Helvetica, sans- ; font-weight: background-color: rgb(255, 255, 255);&&
最近在做在做微信支付中的native支付第二种支付方式,在请求参数时遇到了最大的问题就是,body(商品描述)为中文时,签名失败,为
第2章 EXT框架基础 2.1
Ext的事件和类 Text事件分为两种类型:自定义事件和浏览器事件 2.1.1
自定义事件 所有继承自Ext.util.Observable类的控件都可以支持事 ...
入门vxworks需要安装workbench,用的是6.6版本的,用的是CDR-R-1-00.zip这个文件,去风河官网逛了半天找到链接点击more的时候指向需要注册.网 ...
友情链接:
管理员邮箱:info@处理结果持久化 | 七牛云存储
处理结果持久化(pfop)
之前我们介绍了常规的访问时数据处理机制,那种机制很适合像图片缩略图之类的访问,但无法应用数据处理过程较长的资源,比如花费时间超过一分钟的音频转码,更不用说可能处理时间超过一小时的视频转码。
处理结果持久化机制(pfop)用于满足这种处理时间较长的场景。
开发者可使用该功能对音视频进行异步转码,并将转码结果永久存储于空间中,从而大幅提升访问体验。
处理结果持久化功能还提供即时的处理状态通知和查询功能,因此开发者在开始执行音视频转码后还能随时获取转码进度信息。
处理结果持久化功能可以在两种场景下触发:
在资源上传完成后自动触发处理流程;
针对已存在空间中的资源手动触发处理流程;
下面分别描述这两种详细用法。
上传后自动触发数据处理
开发者如果希望在上传文件后自动触发数据处理过程,需要在构造时在中设置persistentOps和persistentNotifyUrl两个字段。
persistentOps
需要进行的数据处理命令,可以指定多个命令,以;分隔,具体含义见。每一个数据处理命令都应遵循标准格式,参见。
persistentNotifyUrl
用户接收视频处理结果的接口URL。设置persistentOps字段时,本字段必须同时设置。未来该设置项将改为可选,如未设置,则只能使用返回的persistentId主动查询处理进度。
用户使用指定了persistentOps和persistentNotifyUrl的上传凭证上传一个文件之后,服务端返回的响应内容中会包含此次异步处理的进程IDpersistentId,该ID可用于获取处理的进度和结果。
针对用户上传策略的不同,返回的persistentId字段会出现在不同的位置:
设置returnUrl或callbackUrl,响应内容中直接带有persistentId字段;
设置了returnUrl但没有设置returnBody,跳转过程附带的upload_ret参数解码后获得的结果中默认带有persistentId字段;
设置了callbackUrl,但没有设置callbackBody,和之前一样,这种情况下上传会失败;
设置了returnUrl或callbackUrl,且根据需求自定义了相应的Body(returnBody 或 callbackBody),要在Body中使用魔法变量$(persistentId) 来得到。
对已有资源手动触发数据处理
如果需要对已存在于空间中的资源进行处理并持久化处理结果,可按以下方式使用我们的异步处理接口:
POST /pfop HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: QBox &AccessToken&
bucket=&urlEncodedBucket&&key=&urlEncodedKey&&fops=&urlEncodedFops&&notifyURL=&urlEncodedPersistentNotifyUrl&&force=&Force&
其中的AccessToken的生成算法可参见。
正常情况下获得的返回:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: &length&
{&persistentId&: &persistentId&}
处理完成后会向用户指定的notifyURL发送处理结果,用户也可以根据persistentId来主动查询。详情可以参考:。
状态通知和查询
处理过程的状态可通过两种方式获取:
上传时设定persistentNotifyUrl字段,则该URL会收到主动的通知。
服务端完成所有的数据处理后,会以 HTTP POST 的方式将处理状态发送给用户指定的通知URL。
随时手动发起一个查询请求。
开发者可以使用上传时返回的persistentId来随时查询数据处理的状态。查询的接口为:
[GET] /status/get/prefop?id=&persistentId&
用户获得的数据处理状态是一个JSON字符串,内容格式如下:
&id&: &&persistentId&&,
&code&: &overall_result&,
&desc&: &&overall_result_description&&,
&items&: [
&cmd&: &&fop_cmd&&,
&code&: &result&,
&desc&: &&result_description&&,
&error&: &&error_description&&,
&hash&: &&result_hash&&,
&key&: &&result_key&&
状态内容中每个字段的详细含义如下:
数据处理的进程ID,即前文中的persistentId。
状态码,0 表示成功,1 表示等待处理,2 表示正在处理,3 表示处理失败,4 表示回调失败。
状态码对应的详细描述。
JSON数组。包含每个数据处理操作的进度信息。
对应一个特定的数据处理命令。
如果处理失败,这个字段会给出详细的失败原因。
数据处理结果的哈希值。
数据处理结果的唯一资源ID。数据处理结果可通过http://&domain&/&key&访问。
上传一个音频文件persistent.mp3,并设置上传策略中的persistentOp字段为这两个命令:avthumb/mp3/aq/6/ar/16000、avthumb/mp3/ar/44100/ab/32k。
通知接口或主动查询收到的处理状态内容将如下所示:
'code': 0,
'id': 'fn1g76f13',
'desc': 'The fop was completed successfully',
'items': [
'code': 0,
'hash': 'FvvxM7gMI6WfiuXlBgKbkzU67Tpa',
'cmd': 'avthumb/mp3/ar/44100/ab/32k',
'key': 'sFhZ4dSjB1zvL3De1UBX2qZ_VR0=/lgxucMCQso_KOW_YDM-_KVIeX6o5',
'error': '',
'desc': 'The fop was completed successfully'
'code': 0,
'hash': 'FpSzDMYJtP_UY_6EMIyaBe4awXp3',
'cmd': 'avthumb/mp3/aq/6/ar/16000',
'key': '1G8-OWwP3jPLvi7O3qOf7yCl4YI=/lgxucMCQso_KOW_YDM-_KVIeX6o5',
'error': '',
'desc': 'The fop was completed successfully'
访问链接:
为您找到了如下结果,感谢您对七牛的支持。
技术/购买咨询
400-808-9176
开发者支持第一个go的web程序;调用七牛云存储的音频api有关问题解决;条件搜寻文件里的内容 - Web前端当前位置:& &&&第一个go的web程序;调用七牛云存储的音频api有关问第一个go的web程序;调用七牛云存储的音频api有关问题解决;条件搜寻文件里的内容&&网友分享于:&&浏览:0次第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件里的内容package main
&html/template&
&io/ioutil&
&net/http&
&runtime/debug&
ListDir & & &= 0x0001
UPLOAD_DIR & = &./uploads&
TEMPLATE_DIR = &./views&
//cache storage all template
var templates = make(map[string]*template.Template)
func init() {
fileInfoArr, err := ioutil.ReadDir(TEMPLATE_DIR)
check(err)
var templateName, templatePath string
for _, fileInfo := range fileInfoArr {
templateName = fileInfo.Name()
if ext := path.Ext(templateName); ext != &.html& {
templatePath = TEMPLATE_DIR + &/& + templateName
//log.Println(templateName)
log.Println(&Loading template:&, templatePath)
t := template.Must(template.ParseFiles(templatePath))
templates[templateName] = t
//if const template
/*for _, tmpl := range []string{&upload&, &list&} {
//Must ensure in case can't analytic will do error operate,If the template loading is not successful, the program will exit
t := template.Must(template.ParseFiles(tmpl + &.html&))
templates[tmpl] = t
func check(err error) {
if err != nil {
panic(err)
func renderHtml(w http.ResponseWriter, tmpl string, locals map[string]interface{}) {
/*tt := templates[tmpl]
log.Println(&xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&, templates, tmpl, tt)*/
log.Println(locals)
err := templates[tmpl].Execute(w, locals)
check(err)
func isExists(path string) bool {
_, err := os.Stat(path)
//log.Println(err)
if err == nil {
return true
return os.IsExist(err)
//Callback method,
func uploadHandler(w http.ResponseWriter, r *http.Request) {
//log.Println(r.Method)
if r.Method == &GET& {
renderHtml(w, &upload.html&, nil)
if r.Method == &POST& {
f, h, err := r.FormFile(&image&)
//log.Println(f, h, err)
check(err)
filename := h.Filename
defer f.Close()
//log.Println(UPLOAD_DIR, filename)
t, err := ioutil.TempFile(UPLOAD_DIR, filename)
//log.Println(t)
check(err)
defer t.Close()
_, err = io.Copy(t, f) //dst src
check(err)
http.Redirect(w, r, &/view?id=&+filename, http.StatusFound)
func viewHandler(w http.ResponseWriter, r *http.Request) {
imageId := r.FormValue(&id&)
imagePath := UPLOAD_DIR + &/& + imageId
log.Println(imageId, imagePath)
if exists := isExists(imagePath); !exists {
http.NotFound(w, r)
//log.Println(&&)
w.Header().Set(&Content-Type&, &image&)
http.ServeFile(w, r, imagePath)
func listHandler(w http.ResponseWriter, r *http.Request) {
fileInfoArr, err := ioutil.ReadDir(&./uploads&)
//log.Println(fileInfoArr)
check(err)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
locals := make(map[string]interface{})
images := []string{}
for _, fileInfo := range fileInfoArr {
//log.Println(fileInfo)
images = append(images, fileInfo.Name())
locals[&images&] = images //这里map的key是images,对应list.html里面的$.images
renderHtml(w, &list.html&, locals)
//巧用闭包避免运行时错误崩溃
func safeHandler(fn http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
defer func() {
log.Println(&can't past execute or finished execute&)
if e, ok := recover().(error); ok {
log.Println(&50x error&)
//50x error
http.Error(w, e.Error(), http.StatusInternalServerError)
log.Println(&Warn : panic in %v. - %v&, fn, e)
log.Println(string(debug.Stack()))
log.Println(&if no panic then first execute&)
func staticDirHandler(mux *http.ServeMux, prefix string, staticDir string, flags int) {
mux.HandleFunc(prefix, func(w http.ResponseWriter, r *http.Request) {
file := staticDir + r.URL.Path[len(prefix)-1:]
if (flags & ListDir) == 0 {
if exists := isExists(file); !exists {
http.NotFound(w, r)
http.ServeFile(w, r, file)
func main() {
mux := http.NewServeMux()
staticDirHandler(mux, &/assets/&, &./public&, 0)
mux.HandleFunc(&/&, safeHandler(listHandler))
mux.HandleFunc(&/view&, safeHandler(viewHandler))
mux.HandleFunc(&/upload&, safeHandler(uploadHandler))
err := http.ListenAndServe(&:8080&, mux)
if err != nil {
log.Fatal(&ListenAndServe:&, err.Error())
uoload.html
&meta charset=&utf-8&&
&title&upload&/title&
&form method=&POST& action=&/upload& enctype=&multipart/form-data&&
choosing an image to upload :&br&
&input name=&image& type=&file&&
&input type=&submit& value=&Upload&&
&meta charset=&utf-8&&
&title&list&/title&
{{range $.images}}
&li&&a href=&/view?id={{.|urlquery}}&&{{.|html}}&/a&&/li&
注意文件结构&
& & & & & & & & &-photoweb.go
& & & & & & & & &-public
& & & & & & & & & & & & & & & & &-js
& & & & & & & & & & & & & & & & &-css
& & & & & & & & & & & & & & & & &-images
& & & & & & & & & -uploads
& & & & & & & & & -views
& & & & & & & & & & & & & & & & -upload.html
& & & & & & & & & & & & & & & & &-list.html
解决调用七牛音频问题
示例只提供代码方式调用api,不能够像图片处理直接在url中添加参数进行修改
若强用url会提示要预处理音频转码,一般转码采用异步方式
OK,在go的SDK代码中进行,结果发现api给的参数只是个大概,go的api里面的对应参数,不完全和官网贴出来的一样
我们搜需PutPolicy
在rs/token.go 中,看到对应deadline;grep 'xx' * &-R查看文件里内容
package main
. &/qiniu/api/conf&
&/qiniu/api/fop&
&/qiniu/api/io&
&/qiniu/api/rs&
func init() {
ACCESS_KEY = &自己的ak&
SECRET_KEY = &自己sk&
//GET upload access token
func uptoken(bucketName string) string {
putPolicy := rs.PutPolicy{
Scope: bucketName,
//CallbackUrl: callbackUrl,
//CallbackBody:callbackBody,
//ReturnUrl: returnUrl,
//ReturnBody: returnBody,
//AsyncOps: asyncOps,
//EndUser: endUser,
//Expires: expires,
Expires: & & & & & & , //截止时间戳
PersistentOps: & & & &avthumb/mp3&,
PersistentNotifyUrl: &/qiniu/notify&,
return putPolicy.Token(nil)
func main() {
//上传本地文件
upload(&a&)
//5.1 获取文件信息
//getFileInfo()
//6.1.1 查看图像属性
//imageAttr()
//5.2 删除文件
//delFile()
//6.1.1 查看图像属性
func imageAttr() {
var imageUrl = &/kane2.jpg&
ii := fop.ImageInfo{}
infoRet, err := ii.Call(nil, imageUrl)
if err != nil {
// 产生错误
log.Println(&fop getImageInfo failed:&, err)
log.Println(infoRet.Height, infoRet.Width, infoRet.ColorModel, infoRet.Format)
func makeImageInfoUrl(imageUrl string) string {
ii := fop.ImageInfo{}
return ii.MakeRequest(imageUrl)
//5.2 删除文件
func delFile() {
bucket := &needkane&
key := &goupload.jpg&
var rsCli = rs.New(nil)
err := rsCli.Delete(nil, bucket, key)
if err != nil {
// 产生错误
log.Println(&rs.Copy failed:&, err)
//5.1 获取文件信息
func getFileInfo() {
var ret rs.Entry
bucket := &needkane&
key := &kane3.jpg&
var rsCli = rs.New(nil)
var err error
ret, err = rsCli.Stat(nil, bucket, key)
if err != nil {
// 产生错误
log.Println(&rs.Stat failed:&, err)
// 处理返回值
log.Println(ret)
//上传本地文件
func upload(key string) {
uptoken := uptoken(&needkane&)
fmt.Printf(&uptoken:%s\n&, uptoken)
var err error
var ret io.PutRet
var extra = &io.PutExtra{
//Params: params,
//MimeType: mieType,
//Crc32: crc32,
//CheckCrc: CheckCrc,
var localFile = &/home/qboxtest/Downloads/a.wav&
// ret 变量用于存取返回的信息,详情见 io.PutRet
// uptoken 为业务服务器生成的上传口令
// key 为文件存储的标识
// localFile 为本地文件名
// extra 为上传文件的额外信息,详情见 io.PutExtra,可选
err = io.PutFile(nil, &ret, uptoken, key, localFile, extra)
if err != nil {
//上传产生错误
log.Print(&io.PutFile failed:&, err)
//上传成功,处理返回值
log.Print(ret.Hash, ret.Key)
用 file 命令查看文件
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 七牛url 的文章

 

随机推荐