Unity 2018.1 WebGL терпит неудачу на CommitUpdate, используя icsharpcode.sharpziplib - PullRequest
0 голосов
/ 18 мая 2018

Я работал над проектом WebGL с использованием Unity 2017. Мы используем 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 ранее ...)

Может кто-нибудь помочь?Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Наконец-то понял!

Я клонировал проект github SharpZipLib и создал DLL с .Net Standard 2.0 в качестве ClassLibrary.Я заменил мою существующую библиотеку DLL самостоятельно созданной.

Затем я внес небольшие изменения в код: прежде чем мы использовали FileStream для создания zip-файла.Теперь мы используем вариант ZipFile.Create(string path).Также мы используем DiskArchiveStorage ссылку на 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;
}

Теперь он работает как раньше!

0 голосов
/ 21 мая 2018

В библиотеках классов .NET 4.6 может быть случай, когда кодировка 437 находится во встроенном ресурсе.По умолчанию сборки WebGL не включают встроенные ресурсы для сохранения размера.Вы можете включить встроенные ресурсы для WebGL следующим образом:

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

Я не уверен, что это проблема, но, вероятно, стоит попробовать.Если это не работает, это ошибка, которую мы должны исследовать со стороны Unity.Пожалуйста, отправьте сообщение об ошибке.

...