• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak dać do pobrania plik z obrazek z "img" za pomocą javascript lub jquery?

0 głosów
1,173 wizyt
pytanie zadane 29 czerwca 2020 w JavaScript przez SCpl Użytkownik (590 p.)

Funkcje, które znalazłem w Internecie i lekko zmieniłem:

function downloadCanvasImage(name, extension, id) {
  var a = document.createElement("a");
  a.download = name + "." + extension;
  a.href = document.getElementById(id).toDataURL();
  a.click();
}

function downloadText(name, extension, text) {
    var blob = new Blob([text], {type: "text/csv"});
    if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveBlob(blob, name + "." + extension);
    }
    else {
        var a = window.document.createElement('a');
        a.href = window.URL.createObjectURL(blob);
        a.download = name + "." + extension;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        a.href = window.URL.revokeObjectURL(a);
    }
}

Jednak używając tej pierwszej funkcji na "img" wyskakuje błąd, dlatego chciałbym, aby ktoś napisał mi, jak dać do pobrania obraz z "img" za pomocą javascripta lub jquery. I prosiłbym o napisanie ewentualnych poprawek, jakie mógłbym dodać do tych funkcji. Z góry dziękuję. :D

4 odpowiedzi

+2 głosów
odpowiedź 30 czerwca 2020 przez Comandeer Guru (607,250 p.)

A proste przypisanie img.src do a.href nie działa?

To, co masz, działa tylko na canvas​, więc musiałbyś najpierw na płótnie narysować obrazek.

komentarz 30 czerwca 2020 przez SCpl Użytkownik (590 p.)
Na to z canvas wpadłem, ale znalazłem już prostszą drogę. :D
komentarz 30 czerwca 2020 przez SCpl Użytkownik (590 p.)
Gdy bierze się do a.href img.src to przenosi Cię do tego obrazu, a nie zaczyna pobierać.
1
komentarz 30 czerwca 2020 przez Comandeer Guru (607,250 p.)

Jeśli jest opcja zrobienia tego po stronie serwera, np. w PHP, to takie naiwne coś może działać.

Strona:

<img id="obrazek" src="image.php?id=comandeer.jpg" alt="Comandeer" data-name="comandeer.jpg">
<script>
document.querySelector( 'img' ).addEventListener( 'click', ( { target } ) => {
    const name = target.dataset.name;
    const url = `${ target.src }&download`;
    const link = document.createElement( 'a' );

    link.href = url;
    link.download = name;

    link.click();
} );
</script>

Skrypt image.php:

<?php
    if ( !array_key_exists( 'id', $_GET ) ) {
        die();
    }

    $img = explode( '/', $_GET[ 'id' ] );
    $img = array_pop( $img );
    $download = array_key_exists( 'download', $_GET );
    $imgPath = __DIR__ . '/img/' . $img;
    $type = $download ? 'hublabubla/force+download' : mime_content_type( $imgPath );
    $contents = file_get_contents( $imgPath );

    header( 'Content-Type: ' . $type );
    echo $contents;

Skrypt image.php pobiera obrazki z katalogu img. Jeśli skrypt będzie wywołany z samą nazwą obrazka (image.php?id=nazwa-obrazka.rozszerzenie), to go wyświetli. Jeśli będzie wywołany dodatkowo z parametrem download (image.php?id=nazwa-obrazka.rozszerzenie&download), to wymusi pobranie obrazka (przez wysłanie nagłówka Content-Type z dziwacznym MIME type, którego przeglądarka nie zna. Tym sposobem obrazek się pobierze.

Oczywiście ta wersja skryptu jest średnio zabezpieczona i warto, żebyś poczytał o sanityzacji ścieżek.

komentarz 30 czerwca 2020 przez SCpl Użytkownik (590 p.)

Obawiam się, że nie rozumiem działania tego kodu, bo moje umiejętności w PHP kończą się na:
$var1 = "Hello";
$var2 = "World";
echo "$var1 $var2";
A po za tym chciałbym to zrobić za pomocą JS. I próbuje to zrobić i to tego rezultat:

function downloadImgImage(name, extension, id) {
  var canvas = document.createElement("canvas");
  var ctx = canvas.getContext("2d");
  var img = document.getElementById(id);
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0);
  var a = document.createElement("a");
  a.download = name + "." + extension;
  a.href = canvas.toDataURL();
  a.click();
}

ale pisze mi "Failed to execute 'toDataURL' on 'HTMLCanvasElement'" i nie wiem, czy na canvas w zmiennej to nie działa, czy mam gdzieś jakiś błąd. :(

komentarz 30 czerwca 2020 przez Comandeer Guru (607,250 p.)
A możesz podać całą treść błędu, jaki otrzymujesz?
+1 głos
odpowiedź 29 czerwca 2020 przez eunstachy Stary wyjadacz (14,180 p.)
Napisz jaki to błąd.
komentarz 29 czerwca 2020 przez SCpl Użytkownik (590 p.)
"toDataURL is not a function", czyli jeśli dobrze rozumiem to znacznik "img" nie obsługuje tej funkcji, ale nie wiem, jak ją zastąpić.
1
komentarz 30 czerwca 2020 przez eunstachy Stary wyjadacz (14,180 p.)
Tak jak już napisał @Comandeer zamiast

a.href = document.getElementById(id).toDataURL()

użyj

a.href = document.getElementById(id).src

Przy okazji, zamiast var staraj się stosować let lub const
komentarz 30 czerwca 2020 przez SCpl Użytkownik (590 p.)
Takie rozwiązanie przenosi mnie do obrazka, a nie zaczyna pobierania.
+1 głos
odpowiedź 30 czerwca 2020 przez JAKUBW Nałogowiec (33,470 p.)

A może tak?

const downloadImage = (img) => {
    const a = document.createElement('a');
    a.setAttribute('href', img.src);
    a.setAttribute('download', img.src.substring(img.src.lastIndexOf('/') + 1));
    a.click();
}

const img = document.getElementById('.....');
downloadImage(img);

 

komentarz 30 czerwca 2020 przez SCpl Użytkownik (590 p.)
No niestety nie działa. Przenosi mnie do obrazka.
komentarz 1 lipca 2020 przez JAKUBW Nałogowiec (33,470 p.)
U mnie działa, jakiej przeglądarki używasz?
0 głosów
odpowiedź 30 czerwca 2020 przez SCpl Użytkownik (590 p.)
Jak mógłbym prosić to niech osoby, które odpowiadają najpierw testują kod, a potem go wstawiają, bo dwie osoby napisały mi, żebym do a.href przypisał img.src (document.getElementById(id).src). :D
1
komentarz 30 czerwca 2020 przez Comandeer Guru (607,250 p.)
A przetestowałeś to swoje rozwiązanie…? Bo ono też nie działa (wrzuciłem nawet przykład → https://forum.pasja-informatyki.pl/496562/jak-dac-do-pobrania-plik-z-obrazek-z-img-za-pomoca-javascript-lub-jquery?show=496718#c496718 ).
komentarz 30 czerwca 2020 przez SCpl Użytkownik (590 p.)
Rzeczywiście nie sprawdziłem, czy pobrany plik jest prawidłowy.

To tak to nadal nie wiem, jak to zrobić. :(
komentarz 30 czerwca 2020 przez VBService Ekspert (256,600 p.)

Próbowałeś podglądać kod na stronach (online) z edytorami grafiki jak oni to rozwiązali że po kliknięciu <a> pobiera się obrazek?

Podobne pytania

+1 głos
2 odpowiedzi 1,485 wizyt
+1 głos
3 odpowiedzi 358 wizyt
pytanie zadane 6 stycznia 2021 w JavaScript przez Schulz0123 Początkujący (330 p.)
0 głosów
1 odpowiedź 743 wizyt
pytanie zadane 12 stycznia 2018 w JavaScript przez dominikm Nowicjusz (140 p.)

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...