php - Vimeo API : streaming upload using HTTP PUT and blueimp's jQuery fileupload

标签 php jquery file-upload vimeo put

我正在尝试在一个网站上实现一个上传模块,该模块允许我们的用户将视频上传到我们的 Vimeo 帐户。我正在使用 blueimp 的 jQuery 文件上传和 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 请求的请求 header 如下所示:

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 header 强制设置为“video/mp4”,但最终没有任何区别。

我还通过绑定(bind) jquery fileupload 的提交事件检查了文件的大小,我得到的字节数也比 header 中发送的字节数少,在这个例子中是 43418764,这样可以吗?

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

Status Code:308 Resume Incomplete

Range:bytes=0-3948544

Status Code:308 Resume Incomplete

Range:bytes=0-38682624

Status Code:308 Resume Incomplete

Range:bytes=0-43401216

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

Range:bytes=0-43418955

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

{"body":{"error":"Your video file is not valid. Either you have uploaded an invalid file format, or your upload is incomplete. Make sure you verify your upload before marking it as complete."},"status":400,"headers":{"Date":"Mon, 06 Oct 2014 17","Server":"Apache","Vary":"Accept,Vimeo-Client-Id,Accept-Encoding","Cache-Control":"no-cache, max-age=315360000","Expires":"Thu, 03 Oct 2024 17","Content-Length":"184","X-Cnection":"close","Content-Type":"application/vnd.vimeo.error+json","Via":"1.1 dca1-10"}}

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

谢谢!

[编辑] 非常感谢 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 header 的行

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

(参见 edit3)

现在一切正常! :)

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

[edit3] 我还意识到我从来没有更新我的代码以解决我在 Content-Disposition header 中遇到的问题(请参阅上面划掉的文本).感谢 blueimp 的帮助,我发现您可以简单地在 fileuploadsend 回调中删除此 header :

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

最佳答案

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

POST 上传支持多部分,但 POST 上传不支持可续传上传或范围 header 。

关于php - Vimeo API : streaming upload using HTTP PUT and blueimp's jQuery fileupload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222413/

相关文章:

php - 如何从 url 获取 Facebook 页面用户名或 facebook 页面 ID

php - 没有表名的 Cakephp 数据库查询结果,只是像 MySQL 中那样的简单结果?

javascript - Bootstrap 模态和 AngularJS

Jquery通过测试值获取单选按钮的id

java - 如何使用 Commons FileUpload 设置用于存储文件上传的文件夹

带有附加表单数据的 JQuery 多文件上传

单击 WordPress 管理页面表单中的提交按钮时,JavaScript 代码不运行

php - 将文本区域保存到 mySQL 数据库字段 PHP

jQuery 隐藏在手机上不起作用

javascript - 不用AJAX,前台同步拖放文件上传?