2014-10-06 140 views
6

我試圖在網站上實現上傳模塊,以便我們的用戶將視頻上傳到我們的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請求,請求頭的樣子:Vimeo API:使用HTTP PUT和blueimp的jQuery文件上傳進行流式上載

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頭爲「視頻/ MP4 「但最終沒有任何區別。

我也通過綁定jquery fileupload的提交事件來檢查文件的大小,並且我還得到了比標題中發送的字節數少的字節數,在這個例子中是43418764,這樣好嗎?

  • 由upload_link_secure發送PUT請求驗證上傳,一些響應頭我得到:
  • 狀態碼:308續傳未完成

    範圍:字節= 0-3948544

    狀態碼:308續傳未完成

    範圍:字節= 0-38682624

    狀態代碼:308續傳未完成

    範圍:字節= 0-43401216

  • 確保所有字節它使到Vimeo,然後完成上傳
  • 範圍:通過發送上complete_uri 一個DELETE請求驗證上傳當我拿到這最後頭字節= 0-43418955

    這似乎匹配的Content-Length的第一個請求,所以我執行刪除發送請求,這也是效應初探我得到:

    {「體」:{「錯誤」:」您的視頻文件無效。您要麼上傳了無效的文件格式,要麼上傳不完整。 「},」status「:400,」headers「:{」Date「:」Mon,2014年10月6日17「,」Server「:」Apache「,」Vary「 :「Accept,Vimeo-Client-Id,Accept-Encoding」,「Cache-Control」:「no-cache,max-age = 315360000」,「Expires」:「Thu,2010101017」,「Content- Length 「:」 184" , 「X-Cnection」: 「關閉」, 「內容類型」: 「應用/ vnd.vimeo.error + JSON」, 「通過」:「1。1個dca1-10" }}

    我一定都取得了非常愚蠢的錯誤,但我不是很熟悉所有的HTTP請求和反應變量,沒有任何人知道我做錯了什麼?

    謝謝!

    [編輯]非常感謝Dashron,我其實是有設置的jQuery文件上傳的多選項設置爲false:

    $('#file').fileupload({ 
         url: upload_link_secure, 
         type: 'PUT', 
         multipart: false 
        }); 
    

    在那之後,我得到這個HTTP ERR或:

    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內容處置頭線

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

    (見EDIT3

    現在它工作正常! :)

    我被要求提供一個更完整的代碼示例,我想讓PUT上傳工作,所以這裏是一個包含我的Symfony應用程序相關的Twig模板的Gist。我希望它很清楚,它可以提供幫助。代碼可能可以改進很多,但我想這是一個好的起點。 https://gist.github.com/paulgv/13ff6d194bc0d662de7b

    [EDIT3]我也意識到,我從來沒有更新我的代碼與我曾與Content-Disposition頭的問題更清潔的修復(見劃掉文本上方)。由於blueimp的幫助下,我發現,你可以簡單地在fileuploadsend回調刪除此標題:

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

    嘿@paulgv我有同樣的錯誤,並遵循你提到的步驟。現在看起來很好。除了上傳文件之後,我無法在我的帳戶中看到它 - 並且還調用了jquery文件上傳的錯誤回調。任何線索爲什麼? – callmekatootie 2014-11-07 11:28:49

    +0

    嗨@callmekatootie,知道發生了什麼問題的最好方法可能是在上傳過程中觀看Chrome瀏覽器的網絡檢查器中的網絡標籤,您應該能夠看到哪個請求確實會中斷上傳。 – paulgv 2014-11-08 16:54:57

    回答

    1

    PUT上傳不支持多格式編碼。 PUT上傳應該只有文件原始字節的請求體。

    Multipart支持POST上傳,但POST上傳不支持可恢復的上傳或範圍標題。

    相關問題