Загрузка файлов в Onedrive с помощью REST API

Я пытаюсь загрузить файл в OneDrive, используя его REST API. Это то, что я пытаюсь сделать на основе документации, доступной по адресу OneDrive Rest API< /а>:

POST https://apis.live.net/v5.0/me/skydrive/files?access_token=ACCESS_TOKEN
Content-Type: multipart/form-data; boundary=A300x

--A300x
Content-Disposition: form-data; name="file"; filename="HelloWorld.txt"
Content-Type: application/octet-stream

Hello, World!
--A300x--

Вот что у меня есть:

Uri destination = new Uri(string.Format("https://apis.live.net/v5.0/{0}/files?", folder.ID));

BackgroundUploader uploader = new BackgroundUploader ();
uploader.SetRequestHeader("Authorization", "Bearer " + account.AccessToken);
uploader.SetRequestHeader("Content-Type", "multipart/form-data; boundary=\"foo_bar_baz\"");

List<BackgroundTransferContentPart> parts = new List<BackgroundTransferContentPart>();

BackgroundTransferContentPart metaDataPart = new BackgroundTransferContentPart();
metaDataPart.SetHeader("Content-Disposition", "form-data; name=\"file\";filename=\""+content.Name+"\"");
parts.Add(metaDataPart);

BackgroundTransferContentPart contentPart = new BackgroundTransferContentPart();
contentPart.SetHeader("Content-Type", content.ContentType);
// content is a StorageFile
contentPart.SetFile(content);

response.UploadOperation = await uploader.CreateUploadAsync(destination, parts, "form-data", "foo_bar_baz");

Эта строка ниже вызывает ошибку нарушения прав доступа и аварийное завершение работы приложения Магазина Windows:

response.UploadOperation = await uploader.CreateUploadAsync(destination, parts, "form-data", "foo_bar_baz");

person Jack_2060    schedule 02.10.2014    source источник
comment
Пробовали ли вы размещать блоки try/catch вокруг своего кода, чтобы увидеть, было ли выброшено какое-либо исключение?   -  person kiewic    schedule 02.10.2014
comment
Исключение исходит из файла cpp (фоновый API) и не попадает в блок (Exception e). Существует попытка поймать весь этот код.   -  person Jack_2060    schedule 02.10.2014
comment
Как насчет трассировки Fiddler или сетевого монитора?   -  person kiewic    schedule 02.10.2014
comment
Я не думаю, что я даже достиг этого этапа, так как это создаст только UploadOperation. Затем мне придется использовать его, чтобы начать фактическую загрузку. Это вызов API фоновой передачи приложения Windows Store.   -  person Jack_2060    schedule 02.10.2014
comment
Я всегда использовал PUT для загрузки в SkyDrive/OneDrive. Но если вы хотите использовать POST, убедитесь, что ваше тело ТОЧНО соответствует указанному, включая все символы, возвраты и переводы строк.   -  person Jon    schedule 02.10.2014
comment
Не могли бы вы опубликовать код для PUT, я могу использовать PUT, но не смог понять его код.   -  person Jack_2060    schedule 02.10.2014
comment
Вы пытались изменить примеры проектов на github.com/liveservices/LiveSDK-for-Windows чтобы этот сценарий работал итеративно?   -  person Peter Nied    schedule 02.10.2014
comment
Сценарии для приложения магазина Windows по этой ссылке используют LiveSDK с LiveConnectClient. Я использую REST API из LiveSDK, нет подходящего примера, который я мог бы найти.   -  person Jack_2060    schedule 03.10.2014
comment
После повторного прочтения вашего сообщения похоже, что вы пытаетесь передать access_token в качестве заголовка, а не добавлять его в конец URL-адреса.   -  person Jon    schedule 03.10.2014


Ответы (1)


Вы создаете два BackgroundTransferContentPart и добавляете только первый в свой «Список».

Я думаю, вам нужен только один, что-то вроде этого:

List<BackgroundTransferContentPart> parts = new List<BackgroundTransferContentPart>();

BackgroundTransferContentPart metaDataPart = new BackgroundTransferContentPart();
metaDataPart.SetHeader("Content-Disposition",
    "form-data; name=\"file\";filename=\"" + content.Name + "\"");
metaDataPart.SetHeader("Content-Type", content.ContentType);
metaDataPart.SetFile(content);
parts.Add(metaDataPart);

ОБНОВЛЕНИЕ: хорошо, приведенный выше код устранил проблему нарушения прав доступа. Почему вы получаете 400 ошибка — загадка.

Но еще один способ загрузить файл в OneDrive — использовать метод PUT:

Uri putUri = new Uri(string.Format("https://apis.live.net/v5.0/{0}/files/{1}",
    "folder.a4fb14adbccd1917.A4FB14ADBCCD1917!32089",
    content.Name));

BackgroundUploader uploader = new BackgroundUploader();
uploader.SetRequestHeader("Authorization", "Bearer " + accessToken);
uploader.Method = "PUT";

UploadOperation putOperation = uploader.CreateUpload(putUri, content);
await putOperation.StartAsync();

Вы пробовали PUT?

person kiewic    schedule 03.10.2014
comment
Я пробовал это, но это дает ошибку BadRequest (400). - person Jack_2060; 06.10.2014
comment
Я тоже пробовал PUT, он тоже дает неверный запрос. Работает ли это для вас? - person Jack_2060; 08.10.2014
comment
Спасибо, это работает с Put. я не знаю, что пошло не так раньше. - person Jack_2060; 08.10.2014