Jquery Vimeo API文件上传持续返回308响应
我已经在这个问题上纠缠了一个多星期了,并且已经联系了Vimeo支持部门,但没有取得任何进展。我已经阅读了所有关于类似问题的帖子,但仍然没有解决方案。最近的类似帖子是 …但是我没有使用jQuery文件上传插件,因此该选项不适用(我使用的是Jquery Vimeo API文件上传持续返回308响应,jquery,ajax,vimeo,Jquery,Ajax,Vimeo,我已经在这个问题上纠缠了一个多星期了,并且已经联系了Vimeo支持部门,但没有取得任何进展。我已经阅读了所有关于类似问题的帖子,但仍然没有解决方案。最近的类似帖子是 …但是我没有使用jQuery文件上传插件,因此该选项不适用(我使用的是jQuery.ajax) 无论如何,我正在尝试使用HTTP PUT方法()上传视频 我在步骤1中生成了一个上传票证,然后在步骤2中向上传链接安全发送了一个PUT请求。下面是请求 Request URL:https://1511923893.cloud.vimeo.
jQuery.ajax
)
无论如何,我正在尝试使用HTTP PUT方法()上传视频
我在步骤1中生成了一个上传票证,然后在步骤2中向上传链接安全
发送了一个PUT请求。下面是请求
Request URL:https://1511923893.cloud.vimeo.com/upload?ticket_id=9b867d91d7e7f83bb31f0690b6331ac0&video_file_id=522193134&signature=89c47a9b3bfc4a0ece830b75d1845e86&v6=1
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Connection:keep-alive
Content-Length:10498886
Content-Type:video/mp4
Host:1511923893.cloud.vimeo.com
Origin:http://www.talentgapp.local
Referer:http://www.talentgapp.local/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36
以及回应
Request URL:https://1511923893.cloud.vimeo.com/upload?ticket_id=9b867d91d7e7f83bb31f0690b6331ac0&video_file_id=522193134&signature=89c47a9b3bfc4a0ece830b75d1845e86&v6=1
Request Method:PUT
Status Code:200 OK
Remote Address:54.78.176.185:443
响应头
Access-Control-Allow-Headers:Content-Type, Content-Range, X-Requested-With
Access-Control-Allow-Methods:POST, PUT, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Range
Connection:close
Content-Length:0
Content-Type:text/plain
Date:Thu, 28 Apr 2016 11:39:53 GMT
Server:Vimeo/1.0
Timing-Allow-Origin:*
X-Backend-Server:kopiluwak
X-Requested-With:XMLHttpRequest
到目前为止还不错-视频甚至出现在我的Vimeo帐户中(但处于“上传”状态,从未完成)
因此,按照Vimeo文档的建议,我随后尝试验证上传,如步骤3所示(提供与之前相同的请求参数,但文件数据除外,并添加内容范围:bytes*/*
标题:
请求:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Connection:keep-alive
Content-Length:0
Content-Range:bytes */*
Content-Type:video/mp4
Host:1511923893.cloud.vimeo.com
Origin:http://www.talentgapp.local
Referer:http://www.talentgapp.local/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36
而回应
Request URL:https://1511923893.cloud.vimeo.com/upload?ticket_id=9b867d91d7e7f83bb31f0690b6331ac0&video_file_id=522193134&signature=89c47a9b3bfc4a0ece830b75d1845e86&v6=1
Request Method:PUT
Status Code:308 Resume Incomplete
Remote Address:54.78.176.185:443
响应头
Access-Control-Allow-Headers:Content-Type, Content-Range, X-Requested-With
Access-Control-Allow-Methods:POST, PUT, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Range
Connection:close
Content-Length:0
Content-Type:text/plain
Date:Thu, 28 Apr 2016 11:39:53 GMT
Range:bytes=0-10498886
Server:Vimeo/1.0
Timing-Allow-Origin:*
X-Backend-Server:kopiluwak
X-Requested-With:XMLHttpRequest
正如你所看到的,我在308响应中得到了Range:bytes=0-10498886
。我重复了几次这个请求,但是Range
头总是bytes=0-10498886
,我从来没有得到200响应来确认上传已经完成
因此,如果我按照步骤4中所述执行删除
请求,我会得到错误500:无效状态
有人有什么想法吗?我也遇到了这个问题,但至少在我的用例中,我设法解决了这个问题 您没有说明发送数据的格式,但在我的例子中,我发送了一个FormData对象。我改为发送一个原始字节数组,它开始工作 以前(不工作): 现在(工作): 请注意,readAsArrayBuffer不会立即返回数组缓冲区。而是将结果加载到reader.onload处理程序中。由于这不是同步发生的,因此我必须添加一个 我尝试使用reader.readAsBinaryString,但结果与FormData方法相同。reader.readAsArrayBuffer方法现在在Chrome/FF/IE11中适用
请注意,验证步骤的结果仍然是308,但视频已正确上载,删除步骤现在返回200。最后,我现在有了这个工作 感谢@razethestream为我指引了正确的方向 事实证明,在通过XHR发送之前,不需要将文件附加到FormData对象 只需按原样发送文件,即可正常工作 e、 g 此外,我还了解到,验证请求将永远不会返回状态200-这就是Vimeo的文档误导我的原因 验证请求将始终返回308,其中包含
范围:bytes=0-10498886
头,头部分永远不会超过零。它是第二部分(10498886)您应该检查它是否与原始文件的大小匹配。如果匹配,则完成上载。如果在上载文件时执行验证请求,您将注意到范围的第二部分将增加,直到文件完全上载
希望这对其他人有帮助。你有过解决这个问题的方法吗?没有,停了一会儿,仍然没有解决方法(或有用的回复)来自Vimeo,但很快将再次访问它,因此将发布更新。感谢这一点,我们将试一试。顺便说一句,我正在发送一个FormData对象。不确定这有什么关系-有一些插件做同样的事情,它们似乎可以工作(但不适合我们的要求)。
function getVideoFormData($fileUpload) {
var formData = new FormData();
formData.append($fileUpload.files[0].name, $fileUpload.files[0]);
return formData;
}
$.ajax({
type: "PUT",
/*Other relevant options...*/
data: getVideoFormData($"#my-video-id");
});
function getVideoFormData($fileUpload) {
var promise = $.Deferred();
var reader = new FileReader();
reader.onload = function () {
var bytes = this.result;
promise.resolve(bytes);
};
reader.readAsArrayBuffer($fileUpload.files[0]);
return promise;
}
getVideoFormData($"#my-video-id").done(function(bytes){
$.ajax({
type: "PUT",
/*Other relevant options...*/
data: bytes;
});
});
$.ajax({
url : uploadUri,
method : 'PUT',
contentType : false,
crossDomain : true,
headers : {
'Content-Type' : file.type,
'Content-Range': "bytes " + 0 + "-" + (file.size) + "/" + file.size
},
processData : false,
data : files[0] // Not a FormData object
})
.done(function(){
// complete upload
})