Normally you can't make cross-domain HTTP POST requests via
JavaScript. I assume that's the limitation you're running into. The
workaround is to create a server-side script running on the same
domain as your web page that calls the YouTube API's GetUploadToken
endpoint and then returns the result back to your JavaScript client-
side code.
Cheers,
-Jeff Posnick, YouTube API Team
groups.google.com/group/youtube-api-gdata | apiblog.youtube.com |
@YouTubeDev
On Sep 27, 5:05 am, Ramkumar Murugadoss <ramkumar.r...@gmail.com>
wrote:
> Hello,
>
> I'm using PhoneGap for my Android Application, this app requires me to
> upload videos to youtube and Facebook, I did successfully on iPhone.. but in
> the case of Android the Facebook succeed but not the youtube it..
>
> $.ajax("http://gdata.youtube.com/action/GetUploadToken",
> {
> type : "POST",
> beforeSend : function(jqXHR) {
>
> jqXHR.setRequestHeader("Authorization",
> "OAuth " + OAUTH VALUE I GOT);
> jqXHR.setRequestHeader("GData-Version",
> "2");
> jqXHR.setRequestHeader("X-GData-Key",
> "key=\"AI39si6pUBZk4BwA84Wut00mmSTmaYDZXdfaYnn78rlX8sJYPtVwZwPJL89tOIRt2foF Loynb8l2m3Bd0x6C5mqEeQcN8uhOgg\"");
> return jqXHR;
> },
> success : function(data, textStatus, jqXHR) {
> console.log("Youtube upload token success");
> console.log("data: " + data);
> console.log("textStatus: " + textStatus);
> alert('Completed');
> OPS.Events.dispatchEvent(myClipsAuxChange);
> $xml = $(jqXHR.responseXML);
> $url = $xml.find("url");
> console.log("$url.text(): " + $url.text());
> $token = $xml.find("token");
> console.log("$token.text(): " +
> $token.text());
> var upURL = $url.text();
> var upToken = $token.text();
> console.log("Passed text setting");
>
> window.plugins.fileUploader.upload(upURL +
> "?nexturl=http%3A%2F%2Fm.youtube.com%2Fterms", videoPath, {"token":upToken},
> "test", "test.mp4", "video/mp4",
> function(result){
> console.log("Done: " + result);
> alert('Success');
>
> OPS.Events.dispatchEvent(myClipsAuxChange);
> },
> function(result){
> console.log("Error: " + result);
> alert('Failure');
>
> OPS.Events.dispatchEvent(myClipsAuxChange);
> },
> function(loaded,total){
> var percent = .01 * total * loaded;
> console.log(loaded);
> console.log(total);
> console.log("Uploaded " +
> percent);
> });
> console.log("passed fileUploader()");
> },
> error : function(jqXHR, textStatus, errorThrown)
> {
> console.log("Youtube upload failure");
> console.log("textStatus: " + textStatus);
> console.log("errorThrown: " + errorThrown);
> console.log("getResponseHeaders: " +
> jqXHR.getAllResponseHeaders());
> },
> data : '<?xml version="1.0"?><entry
> xmlns="http://www.w3.org/2005/Atom"
> xmlns:media="http://search.yahoo.com/mrss/"
> xmlns:yt="http://gdata.youtube.com/schemas/2007"><media:group><media:title
> type="plain">'+$("#ytTitle").val()+'</media:title><media:description
> type="plain">'+$("#ytDescription").val()+'</media:description><media:catego ry
> scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category><media:keywords>percyfx,
> custom, clip</media:keywords></media:group></entry>',
> contentType : "application/atom+xml;
> charset=utf-8"
>
> }
> );
>
> *
> The Android Plugin code follows*
>
> import java.io.DataOutputStream;
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.FileNotFoundException;
> import java.io.IOException;
> import java.io.InputStream;
> import java.net.HttpURLConnection;
> import java.net.MalformedURLException;
> import java.net.URLEncoder;
>
> import android.net.Uri;
> import java.net.URL;
> import java.util.Iterator;
>
> import org.json.JSONArray;
> import org.json.JSONException;
> import org.json.JSONObject;
>
> import android.util.Log;
> import android.webkit.CookieManager;
>
> import com.phonegap.api.Plugin;
> import com.phonegap.api.PluginResult;
>
> /**
> * @author matt
> *
> */
> public class FileUploader extends Plugin {
>
> /* (non-Javadoc)
> * @see com.phonegap.api.Plugin#execute(java.lang.String,
> org.json.JSONArray, java.lang.String)
> */
> @Override
> public PluginResult execute(String action, JSONArray args, String
> callbackId) {
>
> try {
> String server = args.getString(0);
> String file = args.getString(1);
> JSONObject params = args.getJSONObject(2);
>
> String fileKey = "file";
> String fileName = "image.jpg";
> String mimeType = "image/jpeg";
> if(args.length() > 3) {
> fileKey = args.getString(3);
> }
> if(args.length() > 4) {
> fileName = args.getString(4);
> }
> if(args.length() > 5) {
> mimeType = args.getString(5);
> }
>
> if (action.equals("upload")) {
> upload(file, server, params, fileKey, fileName, mimeType,
> callbackId);
> } else if (action.equals("uploadByUri")) {
> Uri uri = Uri.parse(file);
> upload(uri, server, params, fileKey, fileName, mimeType,
> callbackId);
> } else {
> return new PluginResult(PluginResult.Status.INVALID_ACTION);
> }
> PluginResult r = new
> PluginResult(PluginResult.Status.NO_RESULT);
> r.setKeepCallback(true);
> return r;
> } catch (JSONException e) {
> e.printStackTrace();
> return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
> }
>
> }
>
> public void upload(Uri uri, String server, JSONObject params, final
> String fileKey, final String fileName, final String mimeType, String
> callbackId) {
> try {
> InputStream
> fileInputStream=this.ctx.getContentResolver().openInputStream(uri);
> upload(fileInputStream, server, params, fileKey, fileName,
> mimeType, callbackId);
> } catch (FileNotFoundException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> }
> }
>
> public void upload(String filename, String server, JSONObject params,
> final String fileKey, final String fileName, final String mimeType, String
> callbackId) {
> File uploadFile = new File(filename);
> try {
> FileInputStream fileInputStream = new
> FileInputStream(uploadFile);
> upload(fileInputStream, server, params, fileKey, fileName,
> mimeType, callbackId);
> } catch (FileNotFoundException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> }
>
> }
>
> public void upload(InputStream fileInputStream, String server,
> JSONObject params, final String fileKey, final String fileName, final String
> mimeType, final String callbackId) {
> try {
>
> System.out.println("RRR::");
>
> String lineEnd = "\r\n";
> String td = "--";
> String boundary = "*****com.a3mn.percyfx";
>
> URL url = new URL(server);
> HttpURLConnection conn =
> (HttpURLConnection)url.openConnection();
>
> // Get cookies that have been set in our webview
> CookieManager cm = CookieManager.getInstance();
> String cookie = cm.getCookie(server);
>
> // allow inputs
> conn.setDoInput(true);
> // allow outputs
> conn.setDoOutput(true);
> // don't use a cached copy
> conn.setUseCaches(false);
> // use a post method
> conn.setRequestMethod("POST");
> // set post headers
> conn.setRequestProperty("Connection","Keep-Alive");
>
> conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boun dary);
>
> conn.setRequestProperty("Cookie", cookie);
> // open data output stream
> DataOutputStream dos = new
> DataOutputStream(conn.getOutputStream());
>
> try {
> System.out.println("RRR1::");
> for (Iterator iter = params.keys(); iter.hasNext();) {
> Object key = iter.next();
> dos.writeBytes(URLEncoder.encode(td + boundary +
> lineEnd, "UTF-8"));
> dos.writeBytes(URLEncoder.encode("Content-Disposition:
> form-data; name=\"" + key + "\"; ", "UTF-8"));
> dos.writeBytes(URLEncoder.encode(lineEnd + lineEnd,
> "UTF-8"));
>
> dos.writeBytes(URLEncoder.encode(params.getString(key.toString()),
> "UTF-8"));
> dos.writeBytes(URLEncoder.encode(lineEnd, "UTF-8"));
> }
> } catch (JSONException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> }
>
> dos.writeBytes(URLEncoder.encode(td + boundary + lineEnd,
> "UTF-8"));
> dos.writeBytes(URLEncoder.encode("Content-Disposition:
> form-data; name=\"" + fileKey + "\";filename=\"" + fileName + "\"" +
> lineEnd, "UTF-8"));
> dos.writeBytes(URLEncoder.encode("Content-Type: " + mimeType +
> lineEnd, "UTF-8"));
>
> dos.writeBytes(URLEncoder.encode(lineEnd, "UTF-8"));
> // create a buffer of maximum size
> int bytesAvailable = fileInputStream.available();
> final int total = bytesAvailable;
> Log.e("PhoneGapLog", "available: " + bytesAvailable);
>
> int maxBufferSize = 1024;
> int bufferSize = Math.min(bytesAvailable, maxBufferSize);
> byte[] buffer = new byte[bufferSize];
> // read file and write it into form...
> int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
> int progress = bytesRead;
> int send = 0;
> while (bytesRead > 0)
> {
> dos.write(buffer, 0, bufferSize);
> dos.flush();
> bytesAvailable = fileInputStream.available();
> bufferSize = Math.min(bytesAvailable, maxBufferSize);
> bytesRead = fileInputStream.read(buffer, 0, bufferSize);
> progress += bytesRead;
> final int prog = progress;
> Log.e("PhoneGapLog", "read " + progress + " of " + total);
>
> // Sending every progress event is overkill
> if (send++ % 20 == 0) {
> ctx.runOnUiThread(new Runnable () {
> public void run() {
> try {
> JSONObject result = new JSONObject();
> System.out.println("RRR::
> "+FileUploader.Status.PROGRESS);
> result.put("status",
> FileUploader.Status.PROGRESS);
> result.put("progress", prog);
> result.put("total", total);
> PluginResult progressResult = new
> PluginResult(PluginResult.Status.OK, result);
> progressResult.setKeepCallback(true);
> success(progressResult, callbackId);
> } catch (JSONException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(),
> e);
> }
> }
> });
> // Give a chance for the progress to be sent to
> javascript
> Thread.sleep(100);
> }
> }
> // send multipart form data necessary after file data...
> dos.writeBytes(URLEncoder.encode(lineEnd, "UTF-8"));
> dos.writeBytes(URLEncoder.encode(td + boundary + td + lineEnd,
> "UTF-8"));
>
> // close streams
> fileInputStream.close();
> dos.flush();
> dos.close();
>
> JSONObject result = new JSONObject();
> result.put("status", FileUploader.Status.COMPLETE);
> System.out.println("Upload Completed");
> result.put("progress", progress);
> result.put("total", total);
>
> InputStream is = conn.getInputStream();
> int ch;
> StringBuffer b =new StringBuffer();
> while( ( ch = is.read() ) != -1 ) {
> b.append( (char)ch );
> }
>
> String s=b.toString();
>
> result.put("result", s);
> PluginResult progressResult = new
> PluginResult(PluginResult.Status.OK, result);
> progressResult.setKeepCallback(true);
> success(progressResult, callbackId);
>
> }
> catch (MalformedURLException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> PluginResult result = new
> PluginResult(PluginResult.Status.MALFORMED_URL_EXCEPTION, e.getMessage());
> error(result, callbackId);
> }
> catch (FileNotFoundException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> e.printStackTrace();
> PluginResult result = new
> PluginResult(PluginResult.Status.ERROR, e.getMessage());
> error(result, callbackId);
> }
> catch (IOException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> PluginResult result = new
> PluginResult(PluginResult.Status.IO_EXCEPTION, e.getMessage());
> error(result, callbackId);
> } catch (InterruptedException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> PluginResult result = new
> PluginResult(PluginResult.Status.ERROR, e.getMessage());
> error(result, callbackId);
> } catch (JSONException e) {
> Log.e("PhoneGapLog", "error: " + e.getMessage(), e);
> PluginResult result = new
> PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage());
> error(result, callbackId);
> }
> }
>
> public enum Status {
> PROGRESS,
> COMPLETE
> }
>
> }
>
> The conn.getInputStream() throws File not found exception... but the same
> code I'm using for Facebook works fine.. Can anyone help me...?
>
> *The error I found as follows*
>
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): java.io.FileNotFoundException:http://uploads.gdata.youtube.com/action/FormDataUpload/AIwbFATeYpnied...
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): at
> org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnect...)
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): at
> com.a3mn.percyfx.FileUploader.upload(FileUploader.java:207)
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): at
> com.a3mn.percyfx.FileUploader.upload(FileUploader.java:88)
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): at
> com.a3mn.percyfx.FileUploader.execute(FileUploader.java:58)
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): at
> com.phonegap.api.PluginManager$1.run(PluginManager.java:86)
> 09-27 14:22:41.546: ERROR/PhoneGapLog(12128): at
> java.lang.Thread.run(Thread.java:1096)
> 09-27 14:22:41.546: WARN/System.err(12128): java.io.FileNotFoundException:http://uploads.gdata.youtube.com/action/FormDataUpload/AIwbFATeYpnied...
> 09-27 14:22:41.546: WARN/System.err(12128): at
> org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnect...)
> 09-27 14:22:41.546: WARN/System.err(12128): at
> com.a3mn.percyfx.FileUploader.upload(FileUploader.java:207)
> 09-27 14:22:41.546: WARN/System.err(12128): at
> com.a3mn.percyfx.FileUploader.upload(FileUploader.java:88)
> 09-27 14:22:41.546: WARN/System.err(12128): at
> com.a3mn.percyfx.FileUploader.execute(FileUploader.java:58)
> 09-27 14:22:41.546: WARN/System.err(12128): at
> com.phonegap.api.PluginManager$1.run(PluginManager.java:86)
> 09-27 14:22:41.546: WARN/System.err(12128): at
> java.lang.Thread.run(Thread.java:1096)
>
> Thanks & Regards,
> Ramkumar Murugadoss
--
You received this message because you are subscribed to the Google Groups "YouTube APIs Developer Forum" group.
To post to this group, send email to youtube-api-gdata@googlegroups.com.
To unsubscribe from this group, send email to youtube-api-gdata+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/youtube-api-gdata?hl=en.
No comments:
Post a Comment