Unity 2018.1 WebGL 使用 icsharpcode.sharpziplib 在 CommitUpdate 上失败
Unity 2018.1 WebGL fails on CommitUpdate using icsharpcode.sharpziplib
我一直在使用 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
核对过...)
有人可以帮忙吗?谢谢!
在 .NET 4.6 class 库中,编码 437 可能位于嵌入式资源中。默认情况下,WebGL 构建不包含嵌入式资源以节省大小。您可以像这样为 WebGL 启用嵌入式资源:
https://forum.unity.com/threads/enabling-embedded-resources-with-webgl.326069/
我不确定这是不是问题所在,但可能值得一试。如果这不起作用,则这是我们应该从 Unity 端调查的错误。请提交错误报告。
终于想通了!
我克隆了 github project SharpZipLib 并使用 .Net Standard 2.0 创建了 DLL 作为 ClassLibrary。
我用自己创建的 DLL 替换了现有的 DLL。
然后我对代码做了一些改动:在我们使用 FileStream 生成 zip 文件之前。现在我们使用 ZipFile.Create(string path)
变体。
我们还使用 DiskArchiveStorage
来引用 zip 文件。 ("on disk")
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;
}
现在一切正常!
我一直在使用 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
核对过...)
有人可以帮忙吗?谢谢!
在 .NET 4.6 class 库中,编码 437 可能位于嵌入式资源中。默认情况下,WebGL 构建不包含嵌入式资源以节省大小。您可以像这样为 WebGL 启用嵌入式资源:
https://forum.unity.com/threads/enabling-embedded-resources-with-webgl.326069/
我不确定这是不是问题所在,但可能值得一试。如果这不起作用,则这是我们应该从 Unity 端调查的错误。请提交错误报告。
终于想通了!
我克隆了 github project SharpZipLib 并使用 .Net Standard 2.0 创建了 DLL 作为 ClassLibrary。 我用自己创建的 DLL 替换了现有的 DLL。
然后我对代码做了一些改动:在我们使用 FileStream 生成 zip 文件之前。现在我们使用 ZipFile.Create(string path)
变体。
我们还使用 DiskArchiveStorage
来引用 zip 文件。 ("on disk")
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;
}
现在一切正常!