【问题标题】:Vimeo API C# - Uploading a videoVimeo API C# - 上传视频
【发布时间】:2018-02-21 16:15:36
【问题描述】:

我正在关注关于可恢复上传的 api 指南。 在第 1 步(“创建视频”)之后,我设法得到了回复, 带有 uri 和 upload_link。 关于第二部分,事情还不是很清楚。 它只说明我应该发送哪些标头,但有两件事我没有得到, 首先 - 我需要把“upload_link”放在哪里? 电话应该是这样的:

/me/{upload_link}? (当然我还添加了访问令牌等)

其次,实际文件呢?我想我应该用同样的方法发送它,但是如何发送呢?没有任何消息。

这是 PATCH 请求的代码:

    public string UploadPatch(
string uploadlink,
string method)
{
var headers = new WebHeaderCollection()
{

{ "Tus-Resumable", "1.0.0" },
{ "Upload-Offest", "0" }

};
method = method.ToUpper();


string body = "";
string contentType = "application/offset+octet-stream";

return Helpers.HTTPUpload(uploadlink, method, headers, body, contentType);

}

还有 HTTPUpload():

public static string HTTPPatch(string url, string method,
      WebHeaderCollection headers, string payload,
      string contentType)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.CreateHttp(url);
        if (Proxy != null) request.Proxy = Proxy;

        request.Headers = headers;
        request.Method = method;
        request.Accept = "application/vnd.vimeo.*+json; version=3.1";
        request.ContentType = contentType;
        request.KeepAlive = false;

        if (!String.IsNullOrWhiteSpace(payload))
        {
            var streamBytes = Helpers.ToByteArray(payload);
            request.ContentLength = streamBytes.Length;
            Stream reqStream = request.GetRequestStream();
            reqStream.Write(streamBytes, 0, streamBytes.Length);
            reqStream.Close();
        }

        HttpWebResponse response = (HttpWebResponse)(request.GetResponse());
        Debug.WriteLine(((HttpWebResponse)response).StatusDescription);

        var dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();

        response.Close();

        Debug.WriteLine(String.Format("Response from URL {0}:", url), "HTTPFetch");
        Debug.WriteLine(responseFromServer, "HTTPFetch");
        return responseFromServer;
    }

谢谢

【问题讨论】:

    标签: vimeo-api


    【解决方案1】:

    upload_link 是您将视频上传到的 URL。换句话说,调用https://[...].cloud.vimeo.com/upload?[...] URL,而不是用于其他API 请求的https://api.vimeo.com 主机。

    此外,当您向 cloud.vimeo.comupload_link 发出请求时,仅提供文档中指定的所需标头。

    https://developer.vimeo.com/api/upload/videos#resumable-approach

    【讨论】:

    • 知道了,谢谢!!那么实际的视频文件呢?我需要将其转换为字节吗?以及如何将其添加到通话中?
    • 在第 1 步中,视频文件的大小应以字节为单位,标头为 "upload.size":{size}。在第 2 步中,您将使用视频文件的原始二进制数据向该 upload_link 发出 PATCH 请求。
    • 如果我做对了,{size} 只是一个 int,我通过检查实际文件大小得到。在第 2 步中,我知道我需要发送原始数据,但是如何发送?正如您在我的 UploadPatch 方法中看到的,我正在发送 url (upload_link)、方法 (PATCH)、标头 ({ "Tus-Resumable", "1.0.0" },{ "Upload-Offest", "0" } ), body (null), Content Type(application/offset+octet-stream)。我应该在哪里添加原始数据?
    【解决方案2】:

    代码是VB.Net,但你可以换成C#

    'Imports / use these classes
    'Imports System.Net
    'Imports Newtonsoft.Json
    'Imports System.IO
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
      'Receive the video from File Upload
      If Not IsNothing(fuVideo.PostedFile) Then
        'You will need this for SSL
        System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType.Tls Or (SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12))
        'Path to save the video Save 
        Dim vFilePath As String = Server.MapPath("App_data/Videos")
    
        Dim vFileNameAndPath As String = vFilePath & "/" & fuVideo.PostedFile.FileName
        'Save Video
        fuVideo.PostedFile.SaveAs(vFileNameAndPath)
    
        'Get the size
        Dim vSize As String = New FileInfo(vFileNameAndPath).Length()
    
        'Vimeo URL
        Dim vVimeURL As String = "https://api.vimeo.com/me/videos"
    
        Dim wc As WebClient = New WebClient()
        wc.Headers.Clear()
        wc.Headers.Add("Authorization", "bearer XXXXXXXXXXXXXXXXX") 'Use your App Code
        wc.Headers.Add("Content-Type", "application/json")
        wc.Headers.Add("Accept", "application/vnd.vimeo.*+json;version=3.4")
        wc.Encoding = System.Text.Encoding.UTF8
    
        'txtName is a text box, so you can give a Title to the Video
        Dim vData As String = "{ ""upload"": {""approach"": ""tus"",""size"": """ & vSize & """ }, ""name"" : """ & txtName.Text & """ }"
    
        Dim vimeoTicket = JsonConvert.DeserializeObject(wc.UploadString(vVimeURL, "POST", vData))
        wc.Headers.Clear()
        wc.Headers.Add("Content-Type", "application/offset+octet-stream")
        wc.Headers.Add("Accept", "application/vnd.vimeo.*+json;version=3.4")
        wc.Headers.Add("Tus-Resumable", "1.0.0")
        wc.Headers.Add("Upload-Offset", "0")
        Dim vupload_link As String = vimeoTicket("upload")("upload_link").Value 'Json from Vimeo has the upload_link
        Dim vResponse As Byte() = wc.UploadFile(vupload_link, "PATCH", vFileNameAndPath)
        Response.Write(System.Text.Encoding.Unicode.GetString(vResponse)) ' If everething is ok, vResponse is Nothing
      End If
    Catch ex As Exception
      ltrErro.Text = "Error"
    End Try
    End Sub
    

    【讨论】:

    • 请解释你的答案
    • 我用 WebClient 类代替了 HttpWebRequest,使用起来最简单。代码是 VB.NET 而不是 C#,但很容易翻译 它从网页接收文件,将其保存在服务器中并发送到 Vimeo。所有其余代码都放在命令“uploadFile”的标题或正文中。根据 Vimeo 的说法,您必须发送一个至少为视频大小的初始上传请求,然后 Vimeo 返回一个包含多个信息的 json,但最重要的是upload_link,您必须将视频文件发送到该链接。
    【解决方案3】:

    对此可以看下面的示例代码:-

    我也在 https://github.com/mfilippov/vimeo-dot-net 使用 nuget 库 vimeo-dot-net,它有一个围绕上传、删除等构建的包装器。

           public ActionResult UploadChapterVideoVimeo(HttpPostedFileBase file, string productID = "")
        {
            if (file != null){      
                              var authCheck = Task.Run(async () => await vimeoClient.GetAccountInformationAsync()).Result;
                        if (authCheck.Name != null)
                        {
                            
                            BinaryContent binaryContent = new BinaryContent(file.InputStream, file.ContentType);
                            int chunkSize = 0;
                            int contenetLength = file.ContentLength;
                            int temp1 = contenetLength / 1024;
                            if (temp1 > 1)
                            {
                                chunkSize = temp1 / 1024;
                                chunkSize = chunkSize * 1048576;
                            }
                            else
                            { chunkSize = chunkSize * 1048576; }
                            binaryContent.OriginalFileName = file.FileName;
                            var d = Task.Run(async () => await vimeoClient.UploadEntireFileAsync(binaryContent, chunkSize, null)).Result;
                            vmodel.chapter_vimeo_url = "VIMEO-" + d.ClipUri;
                        }
    
                        return RedirectToAction("ProductBuilder", "Products", new { productId = EncryptedProductID, message = "Successfully Uploaded video", type = 1 });
                    }
                }
                catch (Exception exc)
                {
                    return RedirectToAction("ProductBuilder", "Products", new { productId = EncryptedProductID, message = "Failed to Uploaded video " + exc.Message, type = 0 });
                }
            }
            return null;        }
    

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2020-02-27
      • 2018-06-28
      • 2015-07-16
      相关资源
      最近更新 更多