Jquery Vimeo API文件上传持续返回308响应

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.

我已经在这个问题上纠缠了一个多星期了,并且已经联系了Vimeo支持部门,但没有取得任何进展。我已经阅读了所有关于类似问题的帖子,但仍然没有解决方案。最近的类似帖子是

…但是我没有使用jQuery文件上传插件,因此该选项不适用(我使用的是
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
        })