Unity 2018.1 WebGL使用icsharpcode.sharpziplib在CommitUpdate上失败

时间:2018-05-18 12:25:51

标签: unity3d c#-4.0 zip unity-webgl icsharpcode

我一直在使用Unity 2017开发WebGL项目。我们使用public string ZipFiles(List<string> files) { // create new zip file string zipPath = Application.persistentDataPath + "/upload.zip"; try { // prepare FileStream fsOut = File.Create(zipPath); ZipFile zip = ZipFile.Create(fsOut); // fill zip.BeginUpdate(); foreach (string file in files) { zip.Add(file, Path.GetFileName(file)); } Debug.Log("Zip before commit"); zip.CommitUpdate(); Debug.Log("Zip after commit"); zip.Close(); Debug.Log("Zip after close"); fsOut.Close(); Debug.Log("Zip filestream closed"); } catch (Exception ex) { Debug.Log("Exception Zip: " + ex); } // finish return zipPath; } 生成zip文件并将它们上传到我们的服务器。使用以下代码很有效:

zip.CommitUpdate();

现在随着Unity 2018.1的更新我们也更新到.Net 4.6 - 编辑器中的一切都运行良好。

使用WebGL构建应用程序在NotSupportedException: Encoding 437 data could not be found. Make sure you have correct international codeset assembly installed and enabled. at System.Text.Encoding.GetEncoding (System.Int32 codepage) [0x00000] in <00000000000000000000000000000000>:0 (Filename: currently not available on il2cpp Line: -1)

上失败

错误日志仅显示:

File.exists

我认为这是一个非常无用的错误日志...

文件系统中的zip文件已上传,但为空。文件可用:一个xml和两个json文件。 (早先已经与fill = TRUE进行了检查......)

有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:1)

在.NET 4.6类库中,可能是编码437在嵌入式资源中的情况。默认情况下,WebGL构建不包含用于保存大小的嵌入资源。您可以为WebGL启用嵌入式资源,如下所示:

https://forum.unity.com/threads/enabling-embedded-resources-with-webgl.326069/

我不确定这是个问题,但它可能值得一试。如果这不起作用,那么我们应该从Unity方面调查这个错误。请提交错误报告。

答案 1 :(得分:0)

终于明白了!

我克隆了github project SharpZipLib并使用.Net Standard 2.0创建了DLL作为ClassLibrary。 我用自己创建的DLL替换了我现有的DLL。

然后我对代码做了一些更改:在我们使用FileStream生成zip文件之前。现在我们使用ZipFile.Create(string path)变体。 我们还使用DiskArchiveStorage来引用zip文件。 (&#34;在磁盘上#34;)

public string ZipFiles(List<string> files)
{
    // create new zip file
    string zipPath = Application.persistentDataPath + "/upload.zip";

    try
    {
        // prepare
        ZipFile zip = ZipFile.Create(zipPath);

        // fill
        DiskArchiveStorage myDisk = new DiskArchiveStorage(zip);
        zip.BeginUpdate(myDisk);

        foreach (string file in files)
        {
            Debug.Log("ZIP: add " + file);
            if (!File.Exists(file))
            {
                Debug.Log("File not found!");
            }
            zip.Add(file, Path.GetFileName(file));
        }
        zip.CommitUpdate();
        zip.Close();
    }
    catch (Exception ex)
    {
        Debug.Log("Exception Zip: " + ex);
    }

    // finish
    return zipPath;
}

现在它像以前一样工作!