2013-07-29 7 views
3

Я пытаюсь загрузить файл изображения с html-страницы в хранилище azure blob. До сих пор я написал веб-сервис для создания SAS для моего контейнера blob. Из этого я создал uri формата «blob address»/«имя контейнера»/«blob name»? "SAS". У меня есть элемент управления загрузкой на моей странице html.Загрузите файл изображения в хранилище azure blob из js

Я тогда пытался загрузить файл, используя следующий код:

var xhr = new XMLHttpRequest(); 
xhr.upload.addEventListener("progress", uploadProgress, false); 
xhr.addEventListener("load", uploadComplete, false); 
xhr.addEventListener("error", uploadFailed, false); 
xhr.addEventListener("abort", uploadCanceled, false); 
xhr.open("PUT", blobPath); 
xhr.send(upFile.files[0]); 

где blobPath является УИР, как описано выше, и upFile мой контроль HTML загрузки.

Когда я пытаюсь загрузить файл, запускается процедура uploadFailed. Итак: Правильно ли это? Как улавливать ошибку, возвращаемую загрузкой, чтобы я мог видеть, что происходит не так?

Мои SAS выглядит следующим образом: "стер = с & си = MYPOLICY & сиг = onZTE4buyh3JEQT3% 2B4cJ6uwnWX7LUh7fYQH2wKsRuCg% 3D"

Любая помощь приветствуется, спасибо.

+0

См. Этот ответ https://stackoverflow.com/a/47085661/4167200 – Thomas

ответ

0

я теперь нашел решение, которое работает для этой задачи.Моя загрузка теперь работает следующим образом:

  • Я прочитал файл как DataURL в FileReader

  • Я нарежьте возвращенную строку и отправить каждый ломтик на сервер , где она хранится в сессии переменной

  • После того, как весь файл был отправлен на я вызываю другой веб-сервис, который приклеивает кусочки вместе и получается результат в массив байт

  • Массив байтов затем сохраняется в виде файла в локальном запоминающем устройстве в лазури

  • Наконец файл передается из локального хранилища в хранилище двоичных объектов

См код по адресу:

Upload files from html to azure

+0

Требуется ли для этого решения CORS? – CENT1PEDE

+0

См. Мою ссылку выше «Загрузка файлов с html на azure» для получения более подробной информации. Я придумал это решение, потому что у меня возникали проблемы с CORS (см. Комментарии ниже). –

5

Это, безусловно, правильный путь, однако вы несколько вещей:

  1. Вы должны включить заголовок x-ms-blob-type запроса в запросе, и это значение должно быть BlockBlob.
  2. Также имейте в виду, что для этого вам необходимо разместить свою HTML-страницу в той же учетной записи, так как на сегодняшний день в Azure Blob Storage не поддерживается CORS. Поэтому, если ваша html-страница размещена в каком-либо другом домене, вы получите ошибку из-за CORS.

Вы можете найти эти сообщения в блоге полезные для загрузки сгустков с помощью SAS и AJAX:

http://coderead.wordpress.com/2012/11/21/uploading-files-directly-to-blob-storage-from-the-browser/

http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

+0

Спасибо, это сообщения в блоге, которые я пытался отслеживать, чтобы добиться этого. Теперь я поменял код загрузки на вызов ajax (включая заголовок «x-ms-blob-type»), как показано в сообщении вашего блога, но он все еще не работает. Также вы можете объяснить, что вы подразумеваете под «вам нужно разместить свою HTML-страницу в одной учетной записи хранилища». Моя страница html работает в облачном сервисе. Облачный сервис находится в той же лазурной учетной записи, что и хранилище blob, и я связал облачный сервис с учетной записью blob. Этого достаточно? Спасибо –

+0

Загрузить прямо сейчас: ". $ Ajax ({ URL: blobPath, типа: "PUT", данные: upFile.files [0], ProcessData: ложь, beforeSend: функция (XHR) { XHR .setRequestHeader ('x-ms-blob-type', 'BlockBlob'); xhr.setRequestHeader ('Content-Length', upFile.files [0] .size); }, success: function (data, status) { console.log (данные); console.log (статус); }, ошибка: функция (XHR, убывание, ERR) { console.log (по убыванию); console.log (ERR); } }); ' Это вызывает ошибку, но «err» - «». –

+0

Можете ли вы разместить весь код? Поскольку ваш HTML-файл (который находится в вашем облачном сервисе) и ваше хранилище blob находятся в разных доменах, вы сталкиваетесь с проблемой CORS (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing). Для того, чтобы призывы Ajax к работе, как источник, так и получатель должны находиться в одном домене, и, следовательно, мой комментарий '' вам нужно будет разместить вашу HTML-страницу в той же учетной записи хранилища'. Попробуйте запустить код, скопировав файл HTML в та же учетная запись хранения. Также вы можете отслеживать свой запрос/ответ через Fiddler. –

Смежные вопросы