Save to Local File from Blob

后端 未结 4 1231
梦如初夏
梦如初夏 2020-12-01 15:44

I have a difficult question to you, which i\'m struggeling on for some time now.

I\'m looking for a solution, where i can save a file to the users computer, without

相关标签:
4条回答
  • 2020-12-01 16:20

    Your best option is to use a blob url (which is a special url that points to an object in the browser's memory) :

    var myBlob = ...;
    var blobUrl = URL.createObjectURL(myBlob);
    

    Now you have the choice to simply redirect to this url (window.location.replace(blobUrl)), or to create a link to it. The second solution allows you to specify a default file name :

    var link = document.createElement("a"); // Or maybe get it from the current document
    link.href = blobUrl;
    link.download = "aDefaultFileName.txt";
    link.innerHTML = "Click here to download the file";
    document.body.appendChild(link); // Or append it whereever you want
    
    0 讨论(0)
  • 2020-12-01 16:23

    FileSaver.js implements saveAs for certain browsers that don't have it

    https://github.com/eligrey/FileSaver.js

    Tested with FileSaver.js 1.3.8 tested on Chromium 75 and Firefox 68, neither of which have saveAs.

    The working principle seems to be to just create an <a element and click it with JavaScript oh the horrors of the web.

    Here is a demo that save a blob generated with canvas.toBlob to your download folder with the chosen name mypng.png:

    var canvas = document.getElementById("my-canvas");
    var ctx = canvas.getContext("2d");
    var pixel_size = 1;
    
    function draw() {
        console.log("draw");
        for (x = 0; x < canvas.width; x += pixel_size) {
            for (y = 0; y < canvas.height; y += pixel_size) {
                var b = 0.5;
                ctx.fillStyle =
                    "rgba(" +
                    (x / canvas.width) * 255 + "," +
                    (y / canvas.height) * 255 + "," +
                    b * 255 +
                    ",255)"
                ;
                ctx.fillRect(x, y, pixel_size, pixel_size);
            }
        }
        canvas.toBlob(function(blob) {
          saveAs(blob, 'mypng.png');
        });
    }
    window.requestAnimationFrame(draw);
    <canvas id="my-canvas" width="512" height="512" style="border:1px solid black;"></canvas>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js"></script>

    Here is an animated version that downloads multiple images: Convert HTML5 Canvas Sequence to a Video File

    See also:

    • how to save canvas as png image?
    • JavaScript: Create and save file
    0 讨论(0)
  • 2020-12-01 16:40

    this node dependence was more utils fs-web;

    npm i fs-web
    

    Usage

    import * as fs from 'fs-web';
    
    async processFetch(url, file_path = 'cache-web') {
        const fileName = `${file_path}/${url.split('/').reverse()[0]}`;
        let cache_blob: Blob;
        await fs.readString(fileName).then((blob) => {
          cache_blob = blob;
        }).catch(() => { });
        if (!!cache_blob) {
          this.prepareBlob(cache_blob);
          console.log('FROM CACHE');
        } else {
          await fetch(url, {
            headers: {},
          }).then((response: any) => {
            return response.blob();
          }).then((blob: Blob) => {
            fs.writeFile(fileName, blob).then(() => {
              return fs.readString(fileName);
            });
            this.prepareBlob(blob);
          });
     }
    

    }

    0 讨论(0)
  • 2020-12-01 16:42

    From a file picker or input type=file file chooser, save the filename to local storage:

    HTML:

    <audio id="player1">Your browser does not support the audio element</audio>
    

    JavaScript:

    function picksinglefile() {
        var fop = new Windows.Storage.Pickers.FileOpenPicker();
        fop.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.musicLibrary;
        fop.fileTypeFilter.replaceAll([".mp3", ".wav"]);
        fop.pickSingleFileAsync().then(function (file) {
            if (file) {
                // save the file name to local storage
                localStorage.setItem("alarmname$", file.name.toString());
            } else {
                alert("Operation Cancelled");
            }
        });
    }
    

    Then later in your code, when you want to play the file you selected, use the following, which gets the file using only it's name from the music library. (In the UWP package manifest, set your 'Capabilites' to include 'Music Library'.)

            var l = Windows.Storage.KnownFolders.musicLibrary;
            var f = localStorage.getItem("alarmname$").toString(); // retrieve file by name
            l.getFileAsync(f).then(function (file) {
                // storagefile file is available, create URL from it
                var s = window.URL.createObjectURL(file);
                var x = document.getElementById("player1");
                x.setAttribute("src", s);
                x.play();
            });
    
    0 讨论(0)
提交回复
热议问题