Существует более одного способа…соединить 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 с момента, когда впервые заметил его. Мне не приходило в голову, что эти два сообщения окажутся от одного человека пока не перешел в стадию планирования написания сообщения. Но поскольку темы сообщений настолько различаются, я полагаю, что это будет неделя дважды Дена. ]
Что нравится в этой серии, так это то, что Дэн сопровождает нас в путешествии по созданию исследовательского приложения, его восклицания «ну не клево ли» и «Вот это да! Я сомневаюсь, что можно кодировать с этим API».
Начинаем с Части 1.
Если вы еще не знаете, Dropbox – это облачный сервис хранения, позволяющий сохранять файлы на его серверах и затем получать доступ к ним отовсюду. Этот сервис предоставляет общедоступный API, который я решил интегрировать в приложение Windows Phone 7 для сохранения моих фотографий. Интеграция SkyDrive замечательна, но мне было просто любопытно реализовать ее для DropBox? И эта серия статей описывает, как я создавал приложение.
...
И до Части 6;
Это последняя часть набора руководств, описывающего способ загрузки файлов на Dropbox из приложения Windows Phone 7. Ядро приложения в значительной степени завершено и всё, что нужно сделать, так это правильно управлять процессом реальной загрузки (читай: убедиться, что пользователь знает, что он собирается сделать). Вот некоторые штрихи в дополнение к существующему костяку приложения.
...
Вот шесть частей
Вы правы, теперь время кода, который размещен на CodePlex, SevenDrops;
SevenDrops является загрузчиком фотографий для Windows Phone, позволяющим пользователям сохранять фотографии на Dropbox. Он имеет довольно основательный интерфейс, способствующий быстрому приобретению опыта «запусти и загрузи».
Проект не использует какие-либо посторонние библиотеки и содержит лишь мою собственную обертку для Dropbox API.
Код прост и доступен. Он также самодостаточен. Как и утверждает Дэн, посторонние библиотеки не используются вовсе. Иногда при изучении нового API гораздо легче разобраться, когда всё собрано в одном месте под рукой и код сосредоточен на решении специфичной задачи.
Изюминка заключена в загрузке. Она начинается в интерфейсе при обработке события щелчка по кнопке
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, то серия статей Дэна станет прекрасным местом, с которого следует начинать.
Несколько ссылок, которые могут оказаться полезными: