Freigeben über


Существует более одного способа…соединить Windows Phone 7 с Dropbox с помощью SevenDrops

Грег Дункан

Недавно я писал о библиотеке, обеспечивающей интерфейс между Windows Phone 7 и Dropbox, « Бросая на Dropbox с помощью DropNet » .Красота и сложность разработки ПО заключается в том, что любую проблему всегда можно решить несколькими способами.

Ден Делимарски (Den Delimarsk) опубликовал серию из шести руководств на сайте DZone, посвященную закачке картинок с Windows Phone 7 на Dropbox «Developing SevenDrops - A Dropbox-based photo uploader for Windows Phone 7 [6/6]».

[Звучит знакомо – Ден Делимарски? Это о его работе я рассказывал в прошлом сообщении « Забавные светодиоды, четыре символа за раз, с Netduino и ShieldStudio » . Любопытно, но я вовсе не планировал получать от него материалы подряд. Я сосредоточился на контенте и хотел сделать сообщение по железу и по WP7 в этом наборе, ожидая сообщения о проекте SevenDrops с момента, когда впервые заметил его. Мне не приходило в голову, что эти два сообщения окажутся от одного человека пока не перешел в стадию планирования написания сообщения. Но поскольку темы сообщений настолько различаются, я полагаю, что это будет неделя дважды Дена. clip_image002]

Что нравится в этой серии, так это то, что Дэн сопровождает нас в путешествии по созданию исследовательского приложения, его восклицания «ну не клево ли» и «Вот это да! Я сомневаюсь, что можно кодировать с этим API».

Начинаем с Части 1.

Если вы еще не знаете, Dropbox – это облачный сервис хранения, позволяющий сохранять файлы на его серверах и затем получать доступ к ним отовсюду. Этот сервис предоставляет общедоступный API, который я решил интегрировать в приложение Windows Phone 7 для сохранения моих фотографий. Интеграция SkyDrive замечательна, но мне было просто любопытно реализовать ее для DropBox? И эта серия статей описывает, как я создавал приложение.

...

И до Части 6;

Это последняя часть набора руководств, описывающего способ загрузки файлов на Dropbox из приложения Windows Phone 7. Ядро приложения в значительной степени завершено и всё, что нужно сделать, так это правильно управлять процессом реальной загрузки (читай: убедиться, что пользователь знает, что он собирается сделать). Вот некоторые штрихи в дополнение к существующему костяку приложения.

...

Вот шесть частей

Вы правы, теперь время кода, который размещен на CodePlex, SevenDrops;

SevenDrops является загрузчиком фотографий для Windows Phone, позволяющим пользователям сохранять фотографии на Dropbox. Он имеет довольно основательный интерфейс, способствующий быстрому приобретению опыта «запусти и загрузи».

Проект не использует какие-либо посторонние библиотеки и содержит лишь мою собственную обертку для Dropbox API.

Код прост и доступен. Он также самодостаточен. Как и утверждает Дэн, посторонние библиотеки не используются вовсе. Иногда при изучении нового API гораздо легче разобраться, когда всё собрано в одном месте под рукой и код сосредоточен на решении специфичной задачи.

clip_image004

Изюминка заключена в загрузке. Она начинается в интерфейсе при обработке события щелчка по кнопке

private void button1_Click(object sender, RoutedEventArgs e)

 private void button1_Click(object sender, RoutedEventArgs e)
     {
         string token = IsolatedStorageSettings.ApplicationSettings["token"].ToString();
         string tokenSecret = IsolatedStorageSettings.ApplicationSettings["secret"].ToString();

         App.uploadCounter.Counter = ImageList.Items.Count;

         foreach (ImageUnit unit in Images)
         {
             OAuth.OAuthClient.Upload(unit.ImageName, unit.ImageContents, token, Helpers.Constants.ApiKey, Helpers.Constants.ConsumerSecret, tokenSecret);
         }

         Popup uploadPopup = new Popup();
         uploadPopup.Child = new UploadingFiles();
         uploadPopup.IsOpen = true;
         uploadPopup.VerticalOffset = 100;
         uploadPopup.HorizontalOffset = 25;

         Binding b = new Binding();
         b.Source = App.uploadCounter;
         b.Converter = new CounterToVisibilityConverter();
         b.Path = new PropertyPath("Counter");
         uploadPopup.SetBinding(Popup.IsOpenProperty, b);
     }

И выполняется в методе OAuth.OAuthClient.Upload;

 public static void Upload(string name, byte[] content, string token, string apiKey, string consumerSecret, string tokenSecret)
 {
     Dictionary<string, string> parameters = new Dictionary<string, string>();

     parameters.Add("oauth_consumer_key", apiKey);
     parameters.Add("oauth_signature_method", "HMAC-SHA1");
     parameters.Add("oauth_timestamp", CurrentUNIXTimestamp.Get());
     parameters.Add("oauth_nonce", Guid.NewGuid().ToString().Replace("-", ""));
     parameters.Add("oauth_token", token);
     parameters.Add("oauth_version", "1.0");
     parameters.Add("file", name);

     string OAuthHeader = GetOAuthHeader(parameters, "POST", "https://api-content.dropbox.com/0/files/dropbox/SevenDrops", consumerSecret, tokenSecret);

     string boundary = Guid.NewGuid().ToString();
     string header = "--" + boundary;
     string footer = "--" + boundary + "--";

     HttpWebRequest uploadRequest = (HttpWebRequest)WebRequest.Create("https://api-content.dropbox.com/0/files/dropbox/SevenDrops");
     uploadRequest.ContentType = "multipart/form-data; boundary=" + boundary;
     uploadRequest.Method = "POST";
     uploadRequest.Headers["Authorization"] = OAuthHeader;

     StringBuilder headers = new StringBuilder();
     headers.AppendLine(header);
     headers.AppendLine("Content-Disposition: file; name=\"file\"; filename=\""+ name +"\"");
     headers.AppendLine("Content-Type: application/octet-stream");
     headers.AppendLine();
     headers.AppendLine(Encoding.GetEncoding("iso-8859-1").GetString(content, 0, content.Length));
     headers.AppendLine(footer);

     byte[] contents = Encoding.GetEncoding("iso-8859-1").GetBytes(headers.ToString());

     object[] data = new object[2] { uploadRequest, contents };
     uploadRequest.BeginGetRequestStream(new AsyncCallback(GetData), data);
 }

Если вы собираетесь понять Dropbox API, то серия статей Дэна станет прекрасным местом, с которого следует начинать.

Несколько ссылок, которые могут оказаться полезными: