2014-11-10 3 views
1

Положите меня на этот, пожалуйста.MSStream - в чем смысл?

При настройке отклика ответа WinJS.xhr я могу установить его, среди прочего, на «ms-stream» или blob. Я надеялся использовать концепцию потока при загрузке файла таким образом, что мне не нужно сохранять весь ответ в памяти (видеофайлы могут быть огромными).

Однако все, что я могу сделать с объектом ms-stream, читается с помощью MSStreamReader. Это было бы здорово, если бы я мог сказать, что «потребляет 1024 байта из потока и« цикл », пока поток не исчерпан. Однако, прочитав документы (не пробовал это, так исправьте меня, если я ошибаюсь), кажется, что я могу только читать из потока один раз (например, метод readAsBlob), и я не могу установить начальную позицию. Это означает, что мне нужно прочитать весь ответ в памяти как blob. Кого я могу достичь с помощью responseType, установленного на «blob» в первую очередь. Так в чем же смысл MSStream?

+0

Я заметил, что одно из различий заключается в том, что событие прогресса срабатывает несколько раз для ответов «ms-stream» и один или даже никогда (специфичный для WinJS 2.0?) Для ответов «arraybuffer». – alh84001

ответ

0

Я написал сообщение в блоге некоторое время назад, чтобы ответить на вопросы о MSStream и других типах объектов oddball, с которыми вы сталкиваетесь в WinRT и хосте для приложений JavaScript. См. http://www.kraigbrockschmidt.com/2013/03/22/msstream-blob-objects-html5/. Да, вы можете использовать MSStreamReader для некоторой работы (это синхронный API), но вы также можете передать MSStream в URL.createObjectURL, чтобы назначить ему img.src и т. Д.

С MSStream, вот некоторые из того, что я написал: «MSStream является технически расширением этого API-интерфейса HTML5, который обеспечивает взаимодействие с WinRT. Когда вы получаете объекты MSStream (или Blob) из некоторого API HTML5 (например, XmlHttpRequest с responseType «ms-stream», как вы использовали при загрузке файла или видео или из метода canvas «msToBlob»), вы можете передать эти результаты различным API-интерфейсам WinRT, которые принимают вход IInputStream или IRandomAccessStream. Чтобы использовать пример холста , msRandomAccessStream в блобе из msToBlob может быть передан в API в Windows.Graphics.Imaging для преобразования или транскодирования. Видеопоток можно аналогичным образом работать с использованием API в Windows.Media.Transcoding. Вы также можете просто написать содержимое потока в StorageFile (что не обязательно в файловой системе) или скопировать их в буфер для шифрования ».

Так что MSStreamReader - это не конец. Реальное использование MSStream заключается в передаче объекта в API WinRT, которые принимают вышеупомянутые типы интерфейсов, что открывает много возможностей.

Следует признать, что это недостаточно документированы область, и именно поэтому я написал серию постов под названием, Q & А на файлы, потоки, буферами и Blobs (начальный пост на http://www.kraigbrockschmidt.com/2013/03/18/why-doesnt-storagefile-close-method/).

+0

Да. Ваша серия статей находится поверх любого поиска, содержащего комбинацию winjs stream winrt и т. Д. Я не могу подчеркнуть, насколько это было полезно. Вероятно, это единственное место, которое документирует использование и назначение некоторых из этих объектов. Тем не менее, я не понял, что на самом деле означает «отсоединение потока», и подумал, что MSStream закрыт, загрузка отменена, а данные до этой точки доступны в IInputStream. Очевидно, что это было неправильно, и в манере говорить IInputStream лежит ниже MSStream. Еще раз, спасибо за статьи, они (наряду с некоторыми другими) были неоценимы. – alh84001

1

Ну, оказывается, что метод msDetachStream предоставляет доступ к базовому потоку и не прерывает процесс загрузки. Первоначально я думал, что любые данные, которые не были загружены, были потеряны при вызове этого, поскольку в документах упоминается, что объект MSStream закрыт.