Как предоставить общий доступ к файлам (HTML)

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

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

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

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

Технологии

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

Инструкции

Этап 1: Создание функции обработчика кнопки, чтобы пользователь мог выбрать файл изображения

Следующий код обработчика кнопки позволяет пользователю выбрать файл изображения. Этот файл используется на остальных шагах этого краткого руководства.

Примечание  

В следующем коде используется pickSingleFileAsync. В Windows Phone 8.1 вместо этого нужно использовать pickSingleFileAndContinue.

var imageFile = null;
function pickImageFile() {
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.fileTypeFilter.replaceAll([".jpg", ".bmp", ".gif", ".png"]);
    picker.pickSingleFileAsync().done(function (file) {
        imageFile = file;
    });
}

Этап 2: Настройка приложения в качестве источника данных

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

var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
dataTransferManager.addEventListener("datarequested", shareStorageItemsHandler);

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

Этап 3: Получение объекта DataRequest

Когда происходит событие datarequested, ваше приложение получает объект DataRequest. Этот объект содержит DataPackage, который вы можете использовать для предоставления содержимого, которым желает поделиться пользователь.

var request = e.request;

Этап 4: Настройка свойств названия и описания

request.data.properties.title = "Share StorageItems Example";
request.data.properties.description = "Demonstrates how to share files.";

Этап 5: Добавление файлов в DataPackage.

Чтобы добавить файлы в DataPackage, используйте метод setStorageItems.

request.data.setStorageItems([imageFile]);

Замечания

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

Кроме того, если вы хотите, чтобы получатель данных имел возможность чтения и записи storageItems, используйте версию перегруженного метода setStorageItems, позволяющего указать вариант "только для чтения" или "чтение и запись". Например, источник данных, который отправляет получателю данных запрос на операцию удаления после вставки, будет указывать вариант "чтение и запись", чтобы целевое приложение смогло удалить исходные файлы после их копирования.

Если приложению требуется асинхронная операция для подготовки изображения или эскиза, необходимо использовать шаблон откладывания. Подробнее об этом см. в разделе Совершение асинхронных вызовов в обработчике события datarequested.

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

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

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

var imageFile = null;
function pickImageFile() {
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.fileTypeFilter.replaceAll([".jpg", ".bmp", ".gif", ".png"]);
    picker.pickSingleFileAsync().done(function (file) {
        imageFile = file;
    });
}

function shareStorageItemsHandler(e) {
    var request = e.request;
    request.data.properties.title = "Share StorageItems Example";
    request.data.properties.description = "Demonstrates how to share files.";
    request.data.setStorageItems([imageFile]);
}

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // This app is newly launched; register it as a share source.
            var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
            dataTransferManager.addEventListener("datarequested", shareStorageItemsHandler);
            // Setup the button handler to pick image file
            document.getElementById("chooseImageButton").addEventListener("click", pickImageFile, false);
        } else {
            // TODO: This app was reactivated from suspension.
            // Restore the app state here.
        }
        args.setPromise(WinJS.UI.processAll());
    }
};

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

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

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

Как предоставить общий доступ к HTML

Как поделиться ссылкой

Как предоставить общий доступ к тексту

Краткое руководство: общий доступ к содержимому

DataPackage

Windows.ApplicationModel.DataTransfer

Windows.ApplicationModel.DataTransfer.Share