我尝试在网站上实施上传模块,以便我们的用户将视频上传到我们的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>
状态代码:308恢复不完整
范围:字节= 0-3948544
状态代码:308恢复不完整
范围:字节= 0-38682624
状态代码:308恢复不完整
范围:字节= 0-43401216
范围:字节= 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 = {};
})
答案 0 :(得分:1)
PUT上传不支持多部分表单编码。 PUT上传应该只有一个请求体,只有文件的原始字节。
POST上传支持Multipart,但POST上传不支持可恢复上传或范围标题。