Home > OS >  How can I start a download from c code compiled web assembly?
How can I start a download from c code compiled web assembly?

Time:10-19

I've been trying to not do this javascript side and I haven't found anything satisfying yet. Fetch API seems to be a good lead, but I can't seem to find a way to start the download in the browser so it can download a zip file.

This is emscripten code snippet, but it seems to be a local file of some sort.

#include <stdio.h>
#include <string.h>
#include <emscripten/fetch.h>

void downloadSucceeded(emscripten_fetch_t *fetch) {
  printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
  // The data is now available at fetch->data[0] through fetch->data[fetch->numBytes-1];
  emscripten_fetch_close(fetch); // Free data associated with the fetch.
}

void downloadFailed(emscripten_fetch_t *fetch) {
  printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status);
  emscripten_fetch_close(fetch); // Also free data on failure.
}

int main() {
  emscripten_fetch_attr_t attr;
  emscripten_fetch_attr_init(&attr);
  strcpy(attr.requestMethod, "GET");
  attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
  attr.onsuccess = downloadSucceeded;
  attr.onerror = downloadFailed;
  emscripten_fetch(&attr, "myfile.dat");
}

CodePudding user response:

Add this to your cpp file.

EM_JS(void, DownloadUrl, (const char* str),
{
    url = UTF8ToString(str);
    var hiddenIFrameID = 'hiddenDownloader';
    var iframe = document.getElementById(hiddenIFrameID);

    if (iframe === null)
    {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }

    iframe.src = url;
});

And an example on how to use it.

void Device::DrawContent()
{
    ImGui::Begin("DW Store");

    if (ImGui::Button("Download"))
    {
        DownloadUrl("https://dotnet.microsoft.com/download/dotnet/thank-you/sdk-5.0.402-macos-x64-installer");
    }

    ImGui::End();
}
  • Related