I’m trying to use CORS against the Youtube API from a single page app. The point is to avoid a full page reload (like http://gdata-samples.googlecode.com/svn/trunk/gdata/youtube_upload_cors.html is doing). There are generally two ways this can be done:
- Using a hidden iframe
or
- using XMLHttpRequest with FormData
The latter is most elegant, but not supported in some inferior browsers. I’m in the lucky position that I may ignore those browsers.
Now I wrote the following code:
var fd = new FormData();
fd.append('token', token);
fd.append('file', element.files[0]);
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadError, false);
xhr.addEventListener("abort", uploadAbort, false);
xhr.open("POST", $scope.uploadData.uploadUrl + '?nexturl=' + $location.absUrl());
xhr.send(fd);
This works (as in, it uploads the whole file, whilst emitting progress events happily), but at the end it errors out. I’m not sure what I’m doing wrong, but I’d really love to see a sample using this strategy instead of the full page refresh. Especially dealing with the response and the id in there I am very curious about.
Have you got something like this working?
It’s possible by using Direct Uploading API v2 and FormData + XHR2. Something like: