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

我正在尝试在网站上实施上传模块,以便我们的用户将video上传到我们的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,这样可以吗?

  1. 通过在upload_link_secure上发送PUT请求来validation上传,我获得了一些响应头:

状态代码:308恢复不完整

范围:字节= 0-3948544

状态代码:308恢复不完整

范围:字节= 0-38682624

状态代码:308恢复不完整

范围:字节= 0-43401216

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

范围:字节= 0-43418955

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

{“body”:{“error”:“您的video文件无效。您上传的文件格式无效,或上传不完整。请确保在上传完成之前validation您的上传。”},“状态“:400,”header“:{”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 3024 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标头的行

 // 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 = {}; }) 

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

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