1

我一直在使用 Unity 2017 开发一个 WebGL 项目。我们使用它ICSharpCode.SharpZipLib.Zip来生成 zip 文件并将它们上传到我们的服务器。使用以下代码效果很好:

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;
}

现在随着 Unity 2018.1 的更新,我们也更新到 .Net 4.6 - 在编辑器中一切正常。

使用 WebGL 构建应用程序失败zip.CommitUpdate();

错误日志仅显示:

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)

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

文件系统中的 zip 文件已上传,但为空。文件可用:一个 xml 和两个 json 文件。(之前已经核对File.exists过了……)

任何人都可以帮忙吗?谢谢!

4

2 回答 2

1

在 .NET 4.6 类库中,编码 437 可能是嵌入资源中的情况。默认情况下,WebGL 构建不包含嵌入式资源以节省大小。您可以像这样为 WebGL 启用嵌入式资源:

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

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

于 2018-05-21T12:30:39.773 回答
0

终于想通了!

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

然后我对代码做了一点改动:在我们使用 FileStream 生成 zip 文件之前。现在我们使用ZipFile.Create(string path)变体。我们还使用 aDiskArchiveStorage来引用 zip 文件。(“在磁盘上”)

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;
}

现在它像以前一样工作!

于 2018-05-22T14:24:16.047 回答