API Fotka upload zdjęć

0

Witam, chciałbym spróbować napisać aplikację która byłaby desktopowym klientem fotka.pl

Otóż chciałem teraz dodać możliwość uploadowania zdjęć jednakże cały czas dostaję odpowiedź o błędzie załadowania zdjęcia bez jego numeru czy komunikatu.

oto kod:

 
        public DodajZdjecie(string sciezka, string hash, string nazwa, string haslo, string numer, string nazwaAlbumu)
        {
            string userName = nazwa;
            string userPassword = haslo;
            authInfo = userName + ":" + userPassword;
            apiurl = "http://api.fotka.pl/upload/put.xml?api.auth_method=httpbasic&source=" + sciezka + "&filehash=" + hash + "&album_nr=" + numer + "&description=test" + "&type=albumy_fotki_dodaj";
        }

        public void upPicture()
        {
            WebRequest request = WebRequest.Create(apiurl);
            request.ContentType = "application/x-www-form-urlencoded";
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            request.Headers["Authorization"] = "Basic " + authInfo;
            try
            {
                WebResponse response = request.GetResponse();
                string status = ((HttpWebResponse)response).StatusDescription + "\r\n";
                Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string result = reader.ReadToEnd().Trim();
                XmlDocument doc = new XmlDocument();
                doc.InnerXml = result;
                XmlElement root = doc.DocumentElement;
                XmlNodeList powiadomienia = root.SelectNodes("//body");
                foreach (XmlNode powiadomienie in powiadomienia)
                {
                    string body = powiadomienie.InnerText;
                }
            }
            catch (Exception ex)
            {

            }
        }

Tutaj jest dokumentacja i opis tej funkcji api: http://www.fotka.pl/api/upload/put

Na zdrowy rozsądek, dziwne jest dla mnie to że niby wymaga tylko filename, nie wiem jak jest zrobiony proces wysyłania, myślałem że może jest to po stronie api, ale widocznie nie. Czekam na wskazówki. ;)

0

Wydaje mi się, że ten source to nie jest ścieżka tylko raczej bajty obrazka zamienione na Base64, czyli mniej więcej coś takiego

string source = Convert.ToBase64String(tablicaBajtówObrazka);

Pozdrawiam
Łukasz Gawron

0

Niestety po zmodyfikowaniu kodu tak by zamiast ścieżki do pliku wysyłał tablicę bajtów dostaję ten sam komunikat.

 
    class DodajZdjecie
    {
        string apiurl = string.Empty;
        string authInfo = string.Empty;
        byte[] array;

        public DodajZdjecie(string sciezka, string hash, string nazwa, string haslo, string numer, string nazwaAlbumu)
        {
            string userName = nazwa;
            string userPassword = haslo;
            authInfo = userName + ":" + userPassword;
            array = imageToByteArray(System.Drawing.Image.FromFile(sciezka));
            string source = Convert.ToBase64String(array);
            apiurl = "http://api.fotka.pl/upload/put.xml?api.auth_method=httpbasic&source=" + source + "&filehash=" + hash + "&album_nr=" + numer + "&description=test" + "&type=albumy_fotki_dodaj";
        }
    
        public void upPicture()
        {
            WebRequest request = WebRequest.Create(apiurl);
            request.ContentType = "application/x-www-form-urlencoded";
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            request.Headers["Authorization"] = "Basic " + authInfo;
            try
            {
                WebResponse response = request.GetResponse();
                string status = ((HttpWebResponse)response).StatusDescription + "\r\n";
                Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string result = reader.ReadToEnd().Trim();
                XmlDocument doc = new XmlDocument();
                doc.InnerXml = result;
                XmlElement root = doc.DocumentElement;
                XmlNodeList powiadomienia = root.SelectNodes("//body");
                foreach (XmlNode powiadomienie in powiadomienia)
                {
                    string body = powiadomienie.InnerText;
                }
            }
            catch (Exception ex)
            {

            }
        }

        public byte[] imageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            return ms.ToArray();
        }
    }

A oto komunikat:

<version><![CDATA[3.1]]></version><module_name><![CDATA[upload]]></module_name><action_name><![CDATA[put]]></action_name><status><![CDATA[error]]></status><reason><![CDATA[]]></reason>
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1