Как получить файлы (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

Для совместного использования файлов требуется немного больше подготовки, нежели для более простых типов данных — например, текста. При общем доступе к файлам необходимо учитывать время, которое может потребоваться на обработку файлов.

Если вы считаете, что вашему приложению требуется время для обработки файлов, к которым пользователь хочет предоставить общий доступ, убедитесь, что вы вызвали reportStarted, прежде чем начнете их обработку. Этот метод гарантирует, что система будет поддерживать ваше приложение в активном состоянии, пока оно не завершит обработку файла. После того как ваше приложение выполнит обработку, вызовите reportCompleted, чтобы завершить операцию предоставления общего доступа. Дополнительные сведения см. в теме "Отчет о расширенном состоянии общего доступа" раздела Краткое руководство: получение содержимого с общим доступом.

Что необходимо знать

Технологии

Необходимые условия

  • Вы должны уметь работать с программой Visual Studio и связанными с ней шаблонами.
  • Вы должны знать JavaScript.

Инструкции

Этап 1: Поддержка контракта отправки данных.

Чтобы ваше приложение могло получать общее содержимое, вам нужно объявить, что оно поддерживает контракт отправки данных. Этот контракт позволяет системе узнать о доступности вашего приложения для получения содержимого. Если для создания приложения вы используете шаблон Microsoft Visual Studio, то поддержка контракта получателя данных осуществляется следующим образом.

  1. Откройте файл манифеста (package.appxmanifest).
  2. Откройте вкладку Объявления.
  3. Выберите Конечное приложение в списке Доступные объявления.
  4. Щелкните Добавить, чтобы добавить поддержку контракта получателя данных в ваше приложение.

Этап 2: Укажите типы файлов, поддерживаемые вашим приложением.

Вы можете указать типы файлов, поддерживаемых вашим приложением, указав их расширения в манифесте приложения:

  1. Откройте файл манифеста.
  2. В разделе Форматы данных щелкните Добавить.
  3. Введите расширение имени файла, например, ".txt" (без кавычек).
  4. Повторите предыдущий шаг для всех дополнительных типов файлов.

Ранее описанные действия добавляют следующий раздел в манифест:

<Extensions>
  <Extension Category="windows.shareTarget">
    <ShareTarget>
      <SupportedFileTypes>
        <FileType>.txt</FileType>
    </ShareTarget>
  </Extension>
</Extensions>

Примечание   Вам не нужно указывать StorageItems в разделе "Форматы данных". Поддержка этого осуществляется с помощью раздела манифеста SupportedFileTypes. Если ваше приложение поддерживает все типы файлов, вы можете указать их в манифесте с помощью параметра Поддерживать все типы файлов.

 

Примечание  Вы можете указать другую точку входа, когда ваше приложение активируется для контракта получателя данных. Для этого измените запись на Начальной странице в разделе параметров Приложения в разделе объявления Получатель данных в манифесте пакета. Мы настоятельно рекомендуем использовать отдельный файл JavaScript, который управляет активацией этой страницы. Например, просмотрите образец Общий доступ к содержимому приложения-получателя данных.

 

Этап 3: Добавить обработчик событий, определяющий активацию приложения.

Когда пользователь выбирает ваше приложение для совместного доступа к содержимому, система активирует приложение. Так как это может осуществляться разными способами, вам нужно добавить код, определяющий причину активации. Для этого проверьте значение свойства kind.

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        // The application has been launched. Initialize as appropriate.
    } else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
        ...
    }
};

Этап 4: Получить объект "ShareOperation".

Объект ShareOperation содержит все данные, необходимые приложению для получения содержимого, которое пользователь хочет совместно использовать.

shareOperation = args.detail.shareOperation;

Этап 5: Быстро вернитесь из обработчика активированного события.

Обработчик событий activated должен быстро возвращаться. Поставьте в очередь асинхронное событие из обработчика событий activated, чтобы обработка общих данных происходила после возврата активированного события.

WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });

Остальные шаги выполняются для реализации функции shareReady.

Этап 6: Проверьте, содержит ли DataPackageView StorageItems.

Объект ShareOperation содержит объект DataPackageView. Этот объект является доступной только для чтения версией объекта DataPackage, который был использован исходным приложением для создания данных. Используйте этот объект, чтобы проверить, содержит ли общее содержимое StorageItems.

if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.storageItems)) {
    // Data being shared contains one or more StorageItem. Code to process the StorageItems goes here.
}

Рекомендуем проверить, содержит ли DataPackage формат данных, в котором вы заинтересованы, даже если ваше приложение поддерживает только один формат. Это упростит поддержку других форматов данных в будущем.

Этап 7: Обработайте файлы.

Для получения файлов вызовите метод DataPackageView.GetStorageItemsAsync.

shareOperation.data.getStorageItemsAsync().then(function (storageItems) {
    var fileList = "";
    for (var i = 0; i < storageItems.size; i++) {
        fileList += storageItems.getAt(i).name;
        if (i < storageItems.size - 1) {
            fileList += ", ";
        }
    }
    // In this example, we only display the file names. To do this, you need 
    // a <div> element with an id of "output" in your HTML page.

    // In your app, replace this with whatever is appropriate for your scenario.
    document.getElementById("output").innerText = "Files: " + fileList;
});

Примечание  

Обработка файлов может занять некоторое время. Важно, чтобы вы не заставляли пользователя ждать, пока ваше приложение завершит загрузку и обработку данных. В Windows 8.1 можно вызвать метод reportStarted, чтобы оповестить систему о том, что ваше приложение начало обработку общего содержимого. Система будет поддерживать ваше приложение в активном состоянии, пока вы не вызовете reportCompleted—, даже если пользователь переключится с вашего приложения на исходное приложение. Подробнее см. в разделе "Отчет о состоянии расширенного общего доступа" статьи Краткое руководство: получение общего содержимого.

Этап 8: Вызовите reportCompleted.

После того, как ваше приложение успешно завершит предоставление общего доступа к содержимому, вызовите reportCompleted. После того как вы вызовете этот метод, система закроет ваше приложение.

shareOperation.reportCompleted();

Замечания

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

Полный пример

var shareOperation = null;

function shareReady(args) {
    if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.storageItems)) {
        shareOperation.data.getStorageItemsAsync().then(function (storageItems) {
            var fileList = "";
            for (var i = 0; i < storageItems.size; i++) {
                fileList += storageItems.getAt(i).name;
                if (i < storageItems.size - 1) {
                    fileList += ", ";
                }
            }
            // In this example, we only display the file names. To do this, you need 
            // a <div> element with an id of "output" in your HTML page.

            // In your app, replace this with whatever is appropriate for your scenario.
            document.getElementById("output").innerText = "Files: " + fileList;
        });
    }
}

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        // The app has been launched.
        args.setPromise(WinJS.UI.processAll());
    } else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
        // This app was activated for the Share contract.
        args.setPromise(WinJS.UI.processAll());

        // We receive the ShareOperation object as part of the eventArgs.
        shareOperation = args.detail.shareOperation;

        // We queue an asychronous event so that working with the ShareOperation 
        // object does not block or delay the return of the activation handler.
        WinJS.Application.addEventListener("shareready", shareReady, false);
        WinJS.Application.queueEvent({ type: "shareready" });
    }
};

Связанные разделы

Пример конечного приложения при общем доступе к содержимому

Общий доступ к данным и обмен данными

Как получить HTML

Как получить ссылку

Как получить текст

Краткое руководство. Получение общего содержимого

DataPackage

Windows.ApplicationModel.DataTransfer

Windows.ApplicationModel.DataTransfer.Share

Руководство по отладке целевых приложений