如何共享文件 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

用户经常希望与其他人或应用共享文件。使用共享功能,你的应用可轻松支持各种任务:从使用电子邮件将文件发送给同事,到共享一组家庭度假活动照片。

支持共享文件等功能时,你需要考虑你的应用何时可以将文件准备就绪。大多数情况下,你的应用可能会将文件准备就绪。如果是这种情况,则应执行本主题中的步骤。如果在文件准备就绪之前你的应用需要进行其他工作(例如,将文件从一种格式转换为另一种格式),则你应该查看主题如何支持拉操作。本主题介绍如何使用委托函数,以使目标应用可以从你的应用拉取正在共享的内容,而不是要求你的应用推送该内容。

你需要了解的内容

技术

先决条件

  • 你应当熟悉 Visual Studio 及其关联模板。
  • 你应当熟悉 JavaScript。
  • 你应当了解如何获取文件和其他数据(比如通过使用 FileOpenPicker)。你可以在使用文件选取器访问文件中了解详细信息。

说明

步骤 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 方法的重载版本来指定只读或读/写。例如,请求目标应用执行粘贴时删除操作的源应用应指定读/写,以便目标应用在复制了源文件之后将它们删除。

如果你的应用需要使用异步操作来准备图像或缩略图,你将需要使用推迟模式。我们将在如何在你的数据请求的处理程序中进行异步调用中介绍具体做法。

如果你的应用需要花费较长时间(超过 200 毫秒)才能准备好文件,则需要使用委托函数来共享这些文件。我们将在如何支持拉操作中介绍具体做法。如果你决定使用委托函数,则在添加文件之前,你需要设置 DataPackageFileTypes 属性。

完整示例

下面是用来设置可供用户共享的一些文件的函数的示例。有关更完整的示例,请查阅我们的代码库示例

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