I have implemented very simple versions of this functionality (no zip compression, and no emscripten filesystem API, which I think doesn't help much for this stuff) in some of my WASM apps and demos.
This one can load and save ASM text files via the HTML5 file dialog interface (look under the "File" menu):
And here's a demo to load data via drag and drop:
Unfortunately this kind of stuff isn't doable via emscripten APIs alone, you'll have to use a mix of C and Javascript (mostly Javascript), and move the data in and out of the WASM heap.
The core of the drag'n'drop code is here:
Basically the "usual" HTML5 drag'n'drop event handlers as embedded Javascript, listening for dropped-events, and copying the "payload" into the WASM heap. Due to the asynchronous nature of Javascript APIs this is a quite confusing mess of calling back and forth between the JS and C side unfortunately.
The code to load and save data via the file dialog is here:
...but this stuff is even more confusing and only makes sense after you know how the Javascript APIs work (TBH looking at this stuff after a year I have no idea anymore how it actually works, I only remember that I had a lot of trouble getting it to work across all browsers, and that I had to use outdated and deprecated techniques to get cross-browser compatibility (at least for the "download data to the user machine" stuff).
This is a great example of how convoluted and overall terrible web development is, what's a single call in a "native" operating system is usually a jenga tower of hacks and outdated APIs in the web world (...and don't get me started on clipboard support) :/
But I hope this still helps a bit!