I am attempting to use a WebGL build of a Unity project to download a file that can be passed to other people and then reloaded.
This file, so far, has been created in editor builds using a pretty well documented approach with a custom serialized struct that holds the data to be saved, the system.io filestream, and the BinaryFormatter.Serialize and Deserialize commands. A file created in this way can be used by my current WebGL build load up the proper data. What I am having trouble with is writing this file with WebGL, as the same methods write it to an apparently undownloadable part of an IndexedDB, even with the proper index.
Is there a good way to attempt this? I have tried several, but none seem to work properly so I would like to put this out there as a general question. If you are interested in my attempts, I can post the code here as well.
For anyone in the future who searches fruitlessly for hours looking for what turns out to be a pretty simple solution in two parts. One, the JSLIB that handles downloads:
mergeInto(LibraryManager.library, {
InitiateDownload: function(fileName, textureData) { var link = document.createElement(""a""); link.download = Pointer_stringify(fileName); link.href = 'data:application/octet-stream;charset=utf-8;base64,'+
Pointer_stringify(textureData);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
delete link;
},
});"
Part two, passing in the data. I accomplished this by using BinaryFormatter to write a file to the IndexedDB and then immediately running File.ReadAllBytes, converting that data ToBase64String, then passing it to the JSLIB method like so:
string saveName = “mySaveData.dat”;
string concatinatedFilepath =
Application.persistentDataPath + “/” +
saveName; byte formattedFS =
File.ReadAllBytes(concatinatedFilepath);
string base64 =
System.Convert.ToBase64String(formattedFS);
InitiateDownload(saveName, base64);
Much thanks to @Bunny83 for helping me with this in a different thread.