Jak zapisać obraz do localStorage i wyświetlić go na następnej stronie?

Więc, w zasadzie, muszę przesłać pojedynczy obraz, zapisać go do localStorage, a następnie wyświetlić go na następnej stronie.

Aktualnie mam upload pliku HTML:

<input type='file' id="uploadBannerImage" onchange="readURL(this);" />

Który używa tej funkcji do wyświetlania obrazu na stronie

function readURL(input) 
{
    document.getElementById("bannerImg").style.display = "block";

    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            document.getElementById('bannerImg').src =  e.target.result;
        }

        reader.readAsDataURL(input.files[0]);
    }
}

Obraz jest natychmiast wyświetlany na stronie, aby użytkownik mógł go zobaczyć. Następnie są proszeni o wypełnienie reszty formularza. Ta część działa idealnie.

Po wypełnieniu formularza, następnie naciśnij przycisk "Zapisz". Raz to przycisk jest wciśnięty, zapisuję wszystkie wejścia formularza jako localStorage ciągi. Potrzebuję sposobu na zapisanie obrazu jako elementu localStorage.

Przycisk Zapisz skieruje je również na nową stronę. Ta nowa strona wyświetli dane użytkowników w tabeli, z obrazem na górze.

Tak proste i proste, muszę zapisać obraz w localStorage po naciśnięciu przycisku "Zapisz", a następnie wypożyczyć obraz na następnej stronie z localStorage.

Znalazłem takie rozwiązania jak to skrzypce i to artykuł w moz: / / a HACKS .

Chociaż nadal jestem bardzo zdezorientowany, jak to działa, i naprawdę potrzebuję tylko prostego rozwiązania. Zasadniczo, po naciśnięciu przycisku "Zapisz" muszę znaleźć obraz za pomocą getElementByID, a następnie przetworzyć i zapisać obraz.

Author: brasofilo, 2013-10-04

4 answers

Do tego, kto również potrzebuje rozwiązania tego problemu:

Po pierwsze, chwytam mój obraz za pomocą getElementByID i zapisuję obraz jako Base64. Następnie zapisuję łańcuch Base64 jako wartość localStorage.

bannerImage = document.getElementById('bannerImg');
imgData = getBase64Image(bannerImage);
localStorage.setItem("imgData", imgData);

Oto funkcja, która konwertuje obraz do Żądła Base64:

function getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    var dataURL = canvas.toDataURL("image/png");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

Następnie na następnej stronie stworzyłem obrazek z pustym src jak tak:

<img src="" id="tableBanner" />

I prosto gdy Strona się ładuje, używam tych trzech kolejnych linii, aby uzyskać ciąg base64 z localstorage i zastosować go do obraz z pustym src, który stworzyłem:

var dataImage = localStorage.getItem('imgData');
bannerImg = document.getElementById('tableBanner');
bannerImg.src = "data:image/png;base64," + dataImage;

Przetestowałem go w kilku różnych przeglądarkach i wersjach i wydaje się, że działa całkiem dobrze.

 159
Author: Fizzix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 23:28:59

Napisałem małą bibliotekę 2,2 kb zapisu obrazu w localStorage JQueryImageCaching Sposób użycia:

<img data-src="path/to/image">
<script>
    $('img').imageCaching();
</script>
 8
Author: moledet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-03 13:16:01

Można serializować obraz do Uri danych. Jest tutorial w tym blogu. Spowoduje to utworzenie ciągu znaków, który można przechowywać w magazynie lokalnym. Następnie na następnej stronie użyj uri danych jako źródła obrazu.

 6
Author: Ray Wadkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-04 14:05:10

" zauważ, że najpierw musisz mieć w pełni załadowany obraz (w przeciwnym razie kończący się pustymi obrazami), więc w niektórych przypadkach musisz zawinąć obsługę w: bannerImage.addEventListener ("load", function () {}) – - yuga Nov 1 '17 at 13:04"

Jest to niezwykle ważne. Jedną z opcji, które eksploruję tego popołudnia, jest użycie metod wywołania zwrotnego javascript zamiast addEventListeners, ponieważ nie wydaje się, aby wiązać poprawnie albo. Przygotowanie wszystkich elementów przed załadowaniem strony Bez odświeżania strony ma kluczowe znaczenie.

Jeśli ktoś może rozwinąć to proszę zrobić - jak w, używałeś settimeout, wait, callback, lub metoda addEventListener, aby uzyskać pożądany wynik. Który i dlaczego?

 0
Author: Andrew Ellison Pembroke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 18:46:50