Vimeo API:使用HTTP PUT和blueimp的jQuery fileupload进行流式上传

时间:2014-10-06 18:24:35

标签: php jquery file-upload vimeo put

我尝试在网站上实施上传模块,以便我们的用户将视频上传到我们的Vimeo帐户。我正在使用blueimp的jQuery File上传和Vimeo的新API。 https://github.com/blueimp/jQuery-File-Upload/wiki/Options https://developer.vimeo.com/api/upload#http-put-uploading 我认为它已接近工作但我必须遗漏一些细节。 根据Vimeo的API,我需要: 1.生成上传票,工作正常 2.然后我将upload_link_secure传递给jquery文件上传,开始上传。这就是PUT请求的请求标头的样子:

Request Method:PUT
Status Code:200 OK
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:43418955
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarye8sGy57JH6ACoOfJ

这就是我调用jQuery文件的方式:

$('#file').fileupload({
url: upload_link_secure,
type: 'PUT'
});

我还尝试将Content-Type标题强制为" video / mp4"但它最终没有任何区别。

我还通过绑定jquery fileupload的提交事件来检查文件的大小,并且我得到的字节数也比标题中发送的字节数少,本例中为43418764,这没关系吗? / p>

  1. 通过在upload_link_secure上发送PUT请求来验证上传,我收到一些响应标头:
  2.   

    状态代码:308恢复不完整

         

    范围:字节= 0-3948544

         

    状态代码:308恢复不完整

         

    范围:字节= 0-38682624

         

    状态代码:308恢复不完整

         

    范围:字节= 0-43401216

    1. 确保所有字节都成为Vimeo,然后通过在complete_uri上发送DELETE请求来完成上传 我在验证上传时得到了最后一个标题:
    2.   

      范围:字节= 0-43418955

      它似乎匹配第一个请求中的Content-Length发送,所以我执行DELETE请求,这是我得到的响应:

        

      {&#34; body&#34;:{&#34;错误&#34;:&#34;您的视频文件无效。您上传的文件格式无效,或上传不完整。确保在将其标记为完成之前验证您的上传。&#34;},&#34;状态&#34;:400,&#34;标题&#34;:{&#34;日期&#34;:&# 34; Mon,06 Oct 2014 17&#34;,&#34; Server&#34;:&#34; Apache&#34;,&#34; Vary&#34;:&#34; Accept,Vimeo-Client-Id ,Accept-Encoding&#34;,&#34; Cache-Control&#34;:&#34; no-cache,max-age = 315360000&#34;,&#34; Expires&#34;:&#34; Thu ,2024年10月3日17&#34;,&#34; Content-Length&#34;:&#34; 184&#34;,&#34; X-Cnection&#34;:&#34; close&#34;,& #34; Content-Type&#34;:&#34; application / vnd.vimeo.error + json&#34;,&#34; Via&#34;:&#34; 1.1 dca1-10&#34;}} < / p>

      我一定犯了一个非常愚蠢的错误,但我对所有这些HTTP请求和回复并不是很熟悉,有人知道我做错了吗?

      谢谢!

      [edit] 非常感谢Dashron,我实际上必须将jQuery fileupload的multipart选项设置为false:

      $('#file').fileupload({
              url: upload_link_secure,
              type: 'PUT',
              multipart: false
          });
      

      之后,我收到了这个HTTP错误:

      XMLHttpRequest cannot load https://1511632921.cloud.vimeo.com/upload?[...]. Request header field Content-Disposition is not allowed by Access-Control-Allow-Headers. 
      

      可能有一个干净的修复,但我没有找到它所以我只是评论了在jquery.fileupload.js中设置Content-Disposition标头的行

      // if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
      //     options.headers['Content-Disposition'] = 'attachment; filename="' +
      //         encodeURI(file.name) + '"';
      // }
      

      (参见 edit3

      现在它运作正常! :)

      [edit2] 我被要求提供一个更完整的代码示例,我提出要使PUT上传工作,所以这里是一个Gist,包含我的Symfony应用程序中的相关Twig模板。我希望它足够清楚,它可以提供帮助。代码可能会有很大改进,但我想这是一个好的起点。 https://gist.github.com/paulgv/13ff6d194bc0d662de7b

      [edit3] 我也意识到我从未使用Content-Disposition标题更清楚地修复我的代码(请参阅上面划掉的文字)。感谢 blueimp 的帮助,我发现您只需在fileuploadsend回调中删除此标头:

      .bind('fileuploadsend', function (e, data) {
          data.headers = {};
      })
      

1 个答案:

答案 0 :(得分:1)

PUT上传不支持多部分表单编码。 PUT上传应该只有一个请求体,只有文件的原始字节。

POST上传支持Multipart,但POST上传不支持可恢复上传或范围标题。