优酷第三方上传API没有.NET版本的SDK,让从事.NET开发人员要实现开放平台上传文件无从下手。本文经过一天的预读优酷文档,以NET方式实现了视频上传。

参考:

优酷开放文档 http://open.youku.com/

强烈鄙视优酷团队既然没有NET版本SDK

本来以为可以通过合作级别授权,文档里面说通过合作级别授权自需要用户名和密码,然后去申请合作者身份,优酷客服告知不允许申请。

哎,只能硬着头皮去用NET采用通用授权方式去实现。

通用授权思路:

1、请求用户授权,跳出页面优酷登入授权页面。运行授权后获取授权Code

2、通过授权Code换取AccessToken,完成授权。

3、然后利用AccessToken进行js上传视频。

下面是上传demo的实现代码

 public class HomeController : Controller
{
private string ClidentID = "您的clientid";
private string ClientSecret = "28938bb551381999eb5e365d429e19a7"; private string AccessTokenUrl = "https://openapi.youku.com/v2/oauth2/token";
private string Code = "";
}

  

1、跳转到授权页面
public ActionResult Oauth()
{
  var url = "https://openapi.youku.com/v2/oauth2/authorize?client_id=你的ClientID&response_type=code&redirect_uri=http://您的域名/youku/home/Callback";
  return Redirect(url);
}

 2、Callback获取Code

public ActionResult Callback(string code, string state)
{
Session.Add("Code", code); // 这里为了演示暂时采用session进行存储。实际情况可以存在文件或者数据库中。
FileLogHelper.WriteLog(code);
return Content(code + "...........State=" + state);
}

 3、通过Code获取AccessToken

public ActionResult Index()
{
ViewBag.ClientId = ClidentID;
if (Session["Code"] != null)
{
Code = (string) Session["Code"];
FileLogHelper.WriteLog("session=" + Code);
ViewBag.AccessToken = GetAccessToken();
}
else
{
ViewBag.AccessToken = GetAccessToken();
} return View();
}

 GetAccessToken()方法

    private string GetAccessToken()
{
if (Session["AccessToken"] == null)
{
var stringADict = new Dictionary<string, string>();
stringADict.Add("client_id", ClidentID);
stringADict.Add("client_secret", ClientSecret);
stringADict.Add("grant_type", "authorization_code");
stringADict.Add("code", Code);
stringADict.Add("redirect_uri", "http://www.forfutures.com:33366/youku/home/Callback");
var result = Post.PostGetJson<AccessToken>(AccessTokenUrl, null, stringADict);
Session["AccessToken"] = result.access_token;
return result.access_token; } return Session["AccessToken"] as string;
}

  Index.chtml

@{
Layout = null;
} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META name="Generator" content="EditPlus">
<META name="Author" content="">
<META name="Keywords" content="">
<META name="Description" content="">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
</HEAD>
<link href="http://open.youku.com/assets/lib/bootstrap2.1.0/css/bootstrap.css" rel="stylesheet">
<link href="http://open.youku.com/assets/lib/bootstrap2.1.0/css/bootstrap-responsive.css" rel="stylesheet">
<script src="http://open.youku.com/assets/lib/jquery-1.8.1.min.js"></script>
<script src="http://open.youku.com/assets/lib/uploadjs.php"></script>
<BODY>
<div id="youku-upload">
<div class="container">
<form class="well form-horizontal" name="video-upload">
<fieldset>
<div class="control-group">
<label class="control-label" for="spanSWFUploadButton">选择文件:</label>
<div id="uploadControl" class="controls"></div>
</div>
<div class="control-group">
<label class="control-label" for="input01">标题:</label>
<div class="controls">
<input type="text" class="input-xlarge" id="input01" name="title">
</div>
</div>
<div class="control-group">
<label class="control-label" for="textarea">简介:</label>
<div class="controls">
<textarea class="input-xlarge" id="textarea" rows="" name="description"></textarea>
</div>
</div>
<div class="control-group">
<label class="control-label" for="input02">标签:</label>
<div class="controls">
<input type="text" class="input-xlarge" id="input02" name="tags">
<span class="help-inline"></span>
</div>
</div>
<div class="control-group">
<label class="control-label" for="category-node">类别:</label>
<div class="controls">
<select id="category-node" name="category" ></select>
</div>
</div>
<div class="control-group">
<label class="control-label">版权所有</label>
<div class="controls">
<label class="radio inline">
<input type="radio" name="copyright_type" id="copyright_type2" value="original" checked="">原创
</label>
<label class="radio inline">
<input type="radio" name="copyright_type" id="copyright_type1" value="reproduced">转载
</label>
</div>
</div>
<div class="control-group">
<label class="control-label">视频权限</label>
<div class="controls">
<label class="radio inline">
<input type="radio" name="public_type" id="public_type1" value="all" checked="">公开
</label>
<label class="radio inline">
<input type="radio" name="public_type" id="public_type2" value="friend">仅好友
</label>
<label class="radio inline">
<input type="radio" name="public_type" id="public_type3" value="password">输入密码观看
</label>
<label class="radio inline" style="display:none" id="passwrod">
<input type="text" class="input "name="watch_password">
</label>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary start" id="btn-upload-start">
<i class="icon-upload icon-white"></i>
<span>开始上传</span>
</button>
</div>
</fieldset>
</form>
<div class="row" >
<div class="span5" id="upload-status-wraper" ></div>
</div>
<br>
<div class="well"><h3>说明</h3><ul><li>最大支持上传<strong> GB</strong> 视频文件</li><li>允许上传的视频格式为:wmv,avi,dat,asf,rm,rmvb,ram,mpg,mpeg,3gp,mov,mp4,m4v,dvix,dv,dat,</br>mkv,flv,vob,ram,qt,divx,cpk,fli,flc,mod。不符合格式的视频将会被丢弃,请确保视频格式的正确性,避免上传失败</li><li></li></ul>
</div>
</div>
<!--完成上传的DOM和登录DOM 开始-->
<div id="complete"></div>
<div id="login" style="width:100%;height:100%;position:fixed;z-index:999;left:0px;top:0px;overflow:hidden;display:none;">
</div>
<!--完成上传的DOM和登录DOM 结束-->
</BODY>
<script>
var USE_STREAM_UPLOAD = true;
jQuery(document).ready(function () {
var param = { client_id: " 8fb430c56b72c78c", access_token: "@ViewBag.AccessToken", oauth_opentype: "iframe", oauth_redirect_uri: "http://www.forfutures.com:33366/youku/home/Oauth", oauth_state: "", completeCallback: "uploadComplete", categoryCallback: "categoryLoaded" };
youkuUploadInit(param); }); //上传完成时回调方法
function uploadComplete(data) {
alert("videoid=" + data.videoid + ";title=" + data.title);
} //分类加载后回调方法
function categoryLoaded(data) {
if (data.categories) {
var tpl = '';
for (var i = ; i < data.categories.length; i++) {
if (data.categories[i].term == 'Ads') {
tpl += '<option value="' + data.categories[i].term + '" selected>' + data.categories[i].label + '</option>';
} else {
tpl += '<option value="' + data.categories[i].term + '" >' + data.categories[i].label + '</option>';
}
}
$("#category-node").html(tpl);
}
}
</script>
</HTML>

以上代码就基本上实现优酷视频的上传。

但是还有个问题需要处理,就是AccessToken好像30天就会过期,我们应该在比如29天的时候通过刷新获取新的令牌 Refresh Access Token。这样就可以实现每次都进行授权认证的页面。

 

 

 

Asp.Net MVC实现优酷(youku)Web的上传的更多相关文章

  1. ASP.NET MVC中,怎么使用jquery/ajaxForm上传文件

    ajaxForm插件最好选择:jquery forms plugin. 以下为示例: Ajax.BeginForm @using (Ajax.BeginForm("YourAction&qu ...

  2. 在MVC应用程序中,怎样删除上传的文件

    在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET ...

  3. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  4. ASP.NET MVC 提供与訪问 Web Api

    ASP.NET MVC 提供与訪问 Web Api 一.提供一个 Web Api 新建一个项目.类型就选 "Web Api". 我用的是MVC5,结果生成的项目一大堆东西.还编译只 ...

  5. ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上

    一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...

  6. WEB文件上传下载功能

    WEB文件上传下载在日常工作中经常用到的功能 这里用到JS库 http://files.cnblogs.com/meilibao/ajaxupload.3.5.js 上传代码段(HTML) <% ...

  7. 2014-07-23 利用ASP.NET自带控件实现单文件上传与下载

    效果图 上传文件页面: 下载文件页面:  1.母版页site.Master <%@ Master Language="C#" AutoEventWireup="tr ...

  8. Java Web文件上传原理分析(不借助开源fileupload上传jar包)

    Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web   最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...

  9. web service上传参数代码实例

    web service上传参数代码实例 这次做的项目用到webservice比较多,最开始在网上看的参考dome,发现都不行,后来发现安卓4.0以后有很大的不同,在做传参时,有些东西需要注意: 第一, ...

随机推荐

  1. 【t094】区间运算

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 区间运算是数学的一个领域.在区间运算中,常量和变量并不表示为一个单独.精确的值,而是表示为一个有着上界 ...

  2. java phoenix 连接hbase

    <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core& ...

  3. Oracle数据库零散知识02

    15,函数的创建,要求必须有返回值,必须在语句中调用,需要多个返回值时,使用out参数类型,在user_procedures表中查询属性,在user_source表中查询源代码,创建示例: CREAT ...

  4. 《Windows核心编程》之“完成端口”(对所有IO都是如此,不仅仅是对socket)

    <Windows核心编程>第10章开头部分一再强调:“IO Completion Port”是“构建高性能.可升缩的应用程序”的最佳设施之一,它不仅适用于处理设备IO,也适用于其它越来越多 ...

  5. Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析

    meanShfit均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为 ...

  6. Linux下安装mysql(1)(CentOS)

    标题是(1)也就是说这次是基础安装,这种方式安装,没有组的创建,权限管理,配置文件更改等,仅仅是最基本的安装,适合第一次在linux上安装mysql的新手 1.准备好安装包(Linux-Generic ...

  7. Objective-C 中的Runtime的使用

    Runtime的使用 一直以来,OC被大家冠以动态语言的称谓,其实是因为OC中包含的runtime机制.Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平 ...

  8. 求 1~n 之间素数的个数

    求1到n之间素数的个数 1. 筛选法 筛选掉偶数,然后比如对于 3,而言,筛选掉其整数倍数:(也即合数一定是某数的整数倍,比如 27 = 3*9) int n = 100000000; bool fl ...

  9. Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操作数据库

    如果开发者对SQL语法不熟,甚至以前从未使用过任何数据库,Android的SQLiteDatabase提供了insert.update.delete或query语句来操作数据库. 一.insert方法 ...

  10. this解析

    定时器中的this function Aaa() { var _this = this; //解决关键 this.a = 12; //但凡被定时器调的函数,this必然是window,所以,show里 ...