Reputation: 623
I have been working on a WebGL project using Unity 2017. We use ICSharpCode.SharpZipLib.Zip
to generate zip-files and upload them to our server. This worked well using the following code:
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;
}
Now with the update to Unity 2018.1 we also updated to .Net 4.6 - everything is working fine in Editor.
Using the WebGL build the application fails on zip.CommitUpdate();
Error Log only displays:
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)
I think this a very useless error log...
The zip-file in the file-system gets uploaded, but is empty. Files are available: one xml and two json files. (Already made a check with File.exists
earlier...)
Can anyone help? Thanks!
Upvotes: 1
Views: 1264
Reputation: 623
Finally figured it out!
I cloned the github project SharpZipLib and created the DLL with .Net Standard 2.0 as ClassLibrary. I replaced my existing DLL with the self created DLL.
Then I made little changes to the code: before we were using a FileStream to generate the zip-file. Now we use the ZipFile.Create(string path)
variant.
Also we use a DiskArchiveStorage
refering to the zip-file. ("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;
}
Now it is working like before!
Upvotes: 0
Reputation: 2329
In the .NET 4.6 class libraries, it might be the case that encoding 437 is in an embedded resource. By default WebGL builds do not include embedded resources to save size. You can enable embedded resources for WebGL like this:
https://forum.unity.com/threads/enabling-embedded-resources-with-webgl.326069/
I'm not certain this is the issue, but it is probably worth a try. If this does not work, it is a bug we should investigate from the Unity side. Please submit a bug report.
Upvotes: 1