WP8.1将blob写入文件系统

时间:2015-09-04 08:33:49

标签: cordova phonegap-plugins cordova-plugins

我想做的事情很简单!!这适用于Android(IOS我可以使用Blob URL)

我有一个本地blob,在这种情况下是一个pdf。我希望用户能够查看pdf。我怎样才能做到这一点?

我尝试使用文件插件(org.apache.cordova.file)保存到本地存储,然后使用fileopener2插件打开它。这种方法适用于Android。对于WP8.1,似乎这种方法不起作用。

第一个问题是我甚至无法将blob保存到本地存储。 Windows Phone 8文件插件的文档非常糟糕,谷歌搜索带来的很少。

第二个问题是文件插件文档将windows phone 8标记为不支持编写blob。为什么是这样?我在代码中注意到blob可以转换为base64编码的字符串,所以我认为这意味着必须可以在wp8.1中编写一个blob,其中base64编码的字符串转换回本机部分的blob插件。

在文件插件的WP8.1中,您使用了哪个文件系统URL?没有定义cordova.file。*属性。

如果有人可以告诉我如何将文本文件写入本地存储,然后我可以使用fileopener2插件打开,然后我可以从那里继续。

我感谢任何帮助。非常感谢。

2 个答案:

答案 0 :(得分:0)

您可以编写blob,但您想要保留的所有内容只能保存在local-app-storage中。因此只能从已编写文件的应用程序访问文件。

保存对象序列化/将其转换为字符串并执行以下操作:

   Private Async Function WriteToFileAsync(content As String, folder As String, filename As String) As Task
    Dim fileBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(content.ToCharArray())
    Dim local As StorageFolder = Windows.Storage.ApplicationData.Current.LocalFolder
    Dim dataFolder = Await local.CreateFolderAsync(folder, CreationCollisionOption.OpenIfExists)
    Dim file = Await dataFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting)
    Using stream = Await file.OpenStreamForWriteAsync()
        stream.Write(fileBytes, 0, fileBytes.Length)
    End Using
End Function

要打开现有的pdf文件,请使用LaunchFileAsync(...),查看此页面:How to open pdf file in Windows Phone 8?

您可以使用参数启动其他应用程序但不幸的是,应用程序无法直接相互通信,并且参数的最大长度不适用于blob。

答案 1 :(得分:0)

感谢@anion的回答,这让我找到了解决问题的正确方法。

我发现使用fileopener2插件,我无法将文件(使用标准文件插件)保存到其中一个提供的路径中,然后让fileopener2再次找到它。诀窍是向fileopener2添加一个新方法(仅适用于WP8),我可以在其中传入文件的内容。然后将它保存到本地存储(使用类似于@anion的答案的代码),然后立即使用与其现有的" open"类似的代码启动它。方法

在我的情况下,在我将文件传递给插件之前,我已经获得了该文件的base64字符串,如果您以blob开头,我猜你有相似的内容。

在fileopener2插件中,转到src \ wp8并将其添加到FileOpener2.cs:

        public async void saveAndOpen(string options)
    {

        string[] args = JSON.JsonHelper.Deserialize<string[]>(options);
        string aliasCurrentCommandCallbackId = args[2];

        try
        {
            string base64 = args[0];

            byte[] fileBytes = Convert.FromBase64String(base64);
            StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
            var dataFolder = await local.CreateFolderAsync("SpendControlTemp", CreationCollisionOption.OpenIfExists);
            var file = await dataFolder.CreateFileAsync(args[1], CreationCollisionOption.ReplaceExisting);
            using (var stream = await file.OpenStreamForWriteAsync())
            {
                stream.Write(fileBytes, 0, fileBytes.Length);
            }


            // Launch the bug query file.
            await Windows.System.Launcher.LaunchFileAsync(file);

            DispatchCommandResult(new PluginResult(PluginResult.Status.OK), aliasCurrentCommandCallbackId);
        }
        catch (FileNotFoundException)
        {
            DispatchCommandResult(new PluginResult(PluginResult.Status.IO_EXCEPTION), aliasCurrentCommandCallbackId);
        }
        catch (Exception)
        {
            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR), aliasCurrentCommandCallbackId);
        }
    }

然后,在www文件夹中,将其添加到plugins.FileOpener2.js,就在添加&#34; open&#34;的位之前。方法:

FileOpener2.prototype.saveAndOpen = function (base64, fileName, callbackContext) {
callbackContext = callbackContext || {};
exec(callbackContext.success || null, callbackContext.error || null, 'FileOpener2', 'saveAndOpen', [base64, fileName]);

};

然后,在您的cordova javascript中,您可以执行类似的操作,但仅适用于WP8(您可以使用合并文件夹将其合并,因此iOS和Android会执行&#34;正常&#34;方式):

cordova.plugins.fileOpener2.saveAndOpen(myBase64String, myFileName);

这让我起来了,希望它可以帮到你!