Hi Thanks...
Error was with the way I was writing content to request stream (Rest
was all fine). Yours solution helped me a lot.
thanks
Deepak

On Sep 26, 6:21 pm, eduardofv <[email protected]> wrote:
> Hi,
>
> I'm not sure what the problem may be since I am using OAuth 2 and
> sending the photo with metadata as multipart post. Anyway, I'm
> attaching this *functioning-but-not-thoroughly-tested* code. Hope it
> helps.
>
> Eduardo Flores
>
>         public static bool UploadPhoto(string filename, string
> albumid="default")
>         {
>             if (albumid==null || albumid=="") albumid = "default";
>             var binaryBytes = File.ReadAllBytes(filename);
>
>             var atom = string.Format(
> @"<entry xmlns='http://www.w3.org/2005/Atom'>
>   <title>{0}</title>
>   <summary></summary>
>   <category scheme='http://schemas.google.com/g/2005#kind'
>     term='http://schemas.google.com/photos/2007#photo'/>
> </entry>",
>          Path.GetFileName(filename));
>
>             var dataBytes =
> Encoding.Default.GetBytes(string.Format("Media multipart posting\n--
> END_OF_PART\nContent-Type: application/atom+xml\n\n{0}\n--END_OF_PART
> \nContent-Type: image/jpeg\n\n", atom));
>             var trailBytes = Encoding.Default.GetBytes("\n--
> END_OF_PART--");
>             var totalBytes = dataBytes.Length + binaryBytes.Length +
> trailBytes.Length;
>
>             byte[] data = new byte[totalBytes];
>             int i = 0, j = 0;
>             for (; i < dataBytes.Length; i++)
>                 data[i] = dataBytes[i];
>             for (; j < binaryBytes.Length; j++)
>                 data[i + j] = binaryBytes[j];
>             for (int k = 0; k < trailBytes.Length; k++)
>                 data[i + j + k] = trailBytes[k];
>
>             var resp = Request(
>                 "https://picasaweb.google.com/data/feed/api/user/
> default/albumid/"+albumid+"/",
>                 data,
>                 contentType:"multipart/related; boundary=\"END_OF_PART
> \""
>             );
>
>             return resp!=null;
>         }
>
>         private static Tuple<HttpStatusCode?, string> Request(string
> url, byte[] data=null, string contentType="application/atom+xml",
> Action<HttpWebRequest> OnPrepareRequest=null)
>         {
>             if (GetAccessToken==null || RefreshToken==null) throw new
> ArgumentNullException("Function GetAccessToken.");
>             //if (_user == null) throw new ArgumentNullException("User
> not defined.");
>
>             HttpWebRequest req = null;
>             HttpWebResponse resp = null;
>             Tuple<HttpStatusCode?, string> ret = null;
>
>             Func<Stream,string> GetFullResponse = (stream) =>
>             {
>                 var buffer = new byte[BUFFER_SIZE];
>                 var sb = new StringBuilder();
>                 int count;
>                 while ((count = stream.Read(buffer, 0, BUFFER_SIZE)) >
> 0)
>                 {
>                     var chars=Encoding.UTF8.GetChars(buffer,0,count);
>                     sb.Append(chars);
>                 }
>
>                 return sb.ToString();
>             };
>
>             var keepTrying = true;
>             var retries = 0;
>             while (keepTrying && retries < REQUEST_RETRIES)
>             {
>                 try
>                 {
>                     if (retries++ > 1)
> Helper.LogMessage(string.Format("Reintentando {0}", retries));
>                     req = (HttpWebRequest)WebRequest.Create(url);
>                     req.Headers.Add("Authorization",
> string.Format("OAuth {0}", GetAccessToken()));
>                     req.Headers.Add("GData-Version", "2");
>                     req.ContentType = contentType;
>                     
> //Segúnhttp://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/faf9...
>                     //req.KeepAlive = false;  //Segun yo no funciono
>                     req.Timeout = 30 * 60 * 1000; //30 minutos - y
> esto sí funcionó
>                     if (OnPrepareRequest != null)
>                         OnPrepareRequest(req);
>                     if (data != null)
>                     {
>                         req.Method = "POST";
>                         req.ContentLength = data.Length;
>
>                         //Según el mismo pero mas adelante
>                         //req.SendChunked = true;
>
>                         var stream = req.GetRequestStream();
>                         int i = 0;
>                         while (i < data.Length)
>                         {
>                             stream.Write(data, i, (data.Length - i) >
> 1024 ? 1024 : (data.Length - i));
>                             i += 1024;
>                             //Hace throttling para no abusar del ancho
> de banda
>                             // el Time es en milisegundos entre cada
> write
>                             if
> (Properties.Settings.Default.ThrottleEnabled)
>
> Thread.Sleep(Properties.Settings.Default.ThrottleTime);
>                             //Thread.Sleep(25); //chk:throttle
>                         }
>
>                         stream.Close();
>                     }
>
>                     using (resp = (HttpWebResponse)req.GetResponse())
>                     {
>                         ret = new Tuple<HttpStatusCode?,
> string>(resp.StatusCode, GetFullResponse(resp.GetResponseStream()));
>                     }
>                     keepTrying = false;
>                 }
>                 catch (WebException wex)
>                 {
>                     string body="";
>
>                     //Hay que ver en que otros casos se hace el Retry
>                     if (wex.Response != null &&
> ((HttpWebResponse)wex.Response).StatusCode ==
> HttpStatusCode.Forbidden)
>                     {
>                         Helper.LogMessage("Refreshing Token");
>                         keepTrying = true;
>                         RefreshToken();
>                     }
>                     else
>                     {
>                         //Nada mas mientras hacemos pruebas,
>                         keepTrying = false;
>                         if (wex.Response != null)
> body=GetFullResponse(((HttpWebResponse)wex.Response).GetResponseStream());
>
>                         //chk: Revisar donde se cacharia esta
> excepcion, para reencolar tareas pero que no afecte a otros tipos de
> request
>                         //throw new PicasaWebException(wex.Message + "
> status:" + wex.Status + " body:" + body, wex);
>                         Helper.LogException(new
> ApplicationException(wex.Message + " status:" + wex.Status + " body:"
> + body, wex));
>                         ret = null;
>                     }
>                 }
>             }
>
>             return ret;
>         }

-- 
You received this message because you are subscribed to the Google Groups 
"Google Picasa Web Albums API" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-picasa-data-api?hl=en.

Reply via email to