Asp.Net MVC实现优酷(youku)Web的上传

优酷第三方上传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="3" 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>1 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 = 0; 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。这样就可以实现每次都进行授权认证的页面。

 

 

 

时间: 2024-10-19 14:00:02

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

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

ajaxForm插件最好选择:jquery forms plugin. 以下为示例: Ajax.BeginForm @using (Ajax.BeginForm("YourAction", "YourController", new AjaxOptions() { HttpMethod = "POST" }, new { enctype = "multipart/form-data"})) { @Html.AntiForger

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

在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET的实现方法,是先删除物理路径的文件,然后是删除数据库记录. 打开数据库,写一个删除记录的存储过程: 在FileLibraryEntity.cs添加一个Delete的方法: 创建控制器: 先从数据库中获取记录信息,然后组合文件路径,判断是否存在,存在者删除之.最后是删除数据库记录. 创建视图: #1标

[ASP.NET MVC 小牛之路]18 - Web API

原文:[ASP.NET MVC 小牛之路]18 - Web API Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建Web服务为HTTP客户端提供API.Web API 使用的基础库是和一般的MVC框架一样的,但Web API并不是MVC框架的一部分,微软把Web API相关的类从 System.Web.Mvc 命名空间下提取了出来放在 System.Web.Http 命名空间下.这种理念是把 Web API 作为ASP.NET 平台的核心之一,以使Web API能使用在

20151227:web:上传文件

aspx代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="s

Web文件上传原理

采用WEB技术实现B/S(浏览器/服务器)结构的管理系统是办公自动化的发展趋势.基于WEB技术的管理系统,由于开发周期短:与用户平台无关:易于实现交互式应用:能对信息进行快速.高效的收集.处理和发布,近几年来得到了迅速发展.而ASP技术由于其开发效率高.交互性好,安全性强等特点,逐渐成为开发管理系统的首选工具. 许多基于WEB的应用都涉及文件上传操作.常见的文件上传技术有:基于HTTP协议的:基于VB(或DELPHI等编程语言)开发的文件上传组件的:基于数据库技术的等等.这些方法一般都需要编程者

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

效果图 上传文件页面: 下载文件页面:  1.母版页site.Master <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="upAndDown.SiteMaster" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict/

asp.net core系列 69 Amazon S3 资源文件上传示例

原文:asp.net core系列 69 Amazon S3 资源文件上传示例 一.  上传示例 Amazon Simple Storage Service 是互联网存储解决方案.该服务旨在降低开发人员进行网络规模级计算的难度. Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据.此服务让所有开发人员都能访问同一个具备高扩展性.可靠性.安全性和快速价廉的数据存储基础设施, Amazon 用它来运行其全球的网站网络.此服务旨在为开发人员

数据采集之Web端上传文件到Hadoop HDFS

前言 最近在公司接到一个任务,是关于数据采集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志采集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好最近都有在这方面做知识储备.正所谓养兵千日,用兵一时啊.学习到的东西只有应用到真实的环境中才有意义不是么. 环境 这里只做模拟环境,而不是真实的线上环境,所以也很简单,如果要使用的话还需要优化优化. OS Debian 8.7 Hadoop 2.6.5 SpringBoot 1.5.1.RELEASE 说明一下,这

Java Web文件上传

一. Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个: commons-fileupload commons-io 二.前端代码示例: <form method="post" id="uploadApkForm" action="uploadapk" enctype="multipart/form-data"> <p> 文件:<input name="