Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP: Kuvan lataus?

Sivun loppuun

Sopetus [20.11.2022 16:11:45]

#

Kuinka tehdään turvallinen kuvan lataus palvelimelle?

Kuvan uudelleen nimeys esim. 0fy5d2c6b.jpg ja kelpaa yleisimmät kuvatiedostot.

Tässä muokattavaksi.

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("INSERT INTO tuotteet (nimi, hinta, kuva) VALUES (?, ?, ?)");
$kysely->execute(array($_POST["nimi"], $_POST["hinta"], $_POST["kuva"]));

$id = $yhteys->lastInsertId();
header("Location: tuote.php?id=$id");
?>

Metabolix [21.11.2022 08:58:39]

#

Lue Upload-koodivinkki kohdasta case "kuva-tark". Ei ole täydellinen mutta varmaan noissa olosuhteissa ajaa asiansa. (Nykyään voisi jo selaimen puolella skaalata kuvan sopivaksi ja muuntaa jpg-muotoon.)

muuskanuikku [21.11.2022 11:21:06]

#

Metabolix kirjoitti:

Lue Upload-koodivinkki kohdasta case "kuva-tark". Ei ole täydellinen mutta varmaan noissa olosuhteissa ajaa asiansa. (Nykyään voisi jo selaimen puolella skaalata kuvan sopivaksi ja muuntaa jpg-muotoon.)

Enpä näe mitään iloa kuvan pakkaamisesta selaimen päässä. Säästähän se vähäsen kaistaa, mutta asetusten muuttamisesta tulee vaikeampaa, varsinkin jos tekee rajapintaa mobiilisovellukselle. Lisäksi käytännössä aina halutaan tuottaa kuvasta useita eri kokoja ja näiden generointi selaimen päässä on yksinkertaisesti tyhmää.

Sopetus [22.11.2022 12:14:34]

#

Olen tuota koodivinkkiä joskus katsonut. Option toiminnolle ei ole käyttöä, eikä siinä ole insert tietokantaan. Olisiko vähän yksinkertaisempaa koodia tuohon laittamaani ylläolevaan esimerkkiin?

Kuinka png-kuvan voisi muuntaa jpg ladattaessa palvelimelle?

Metabolix [22.11.2022 12:58:05]

#

Sopetus kirjoitti:

Option toiminnolle ei ole käyttöä, eikä siinä ole insert tietokantaan.

Vai niin. Ei luulisi tämän olevan ongelma, kun tietokantakoodi sinulla jo näyttää olevan ja valikon voit helposti poistaa. Meinasithan kuitenkin itse ohjelmoida jotain etkä pelkästään kopioida valmiita koodeja? (Muista lisenssit: mitään koodia ei saa kopioida ilman lupaa.)

Koodivinkistä voit opetella, miten tiedot ovat $_FILES-taulukossa ja miten tiedosto tallennetaan.

Kuvan muuntaminen onnistuu helposti GD-kirjastolla, jos se on palvelimella käytössä, ja tästä löytyy netistä esimerkkejä helpoilla hakusanoilla kuten ”php convert image jpg”. Monimutkaisempia muunnoksia voi sitten tehdä vaikka ImageMagick-kirjastolla, mutta sitä varten pitäisi nähdä itsekin vähän vaivaa.

Yksinkertaistettuna voisit lisätä tiedoston käsittelyn oman koodisi alkuun tähän tapaan:

$_POST["kuva"] = null;
if (empty($_FILES["kuva"]["error"]) && !empty($_FILES["kuva"]["tmp_name"])) {
  $data = file_get_contents($_FILES["kuva"]["tmp_name"]);
  if ($gd = imagecreatefromstring($data)) {
    $nimi = "kuva_" . hash("sha256", $data) . ".jpg";
    if (imagejpeg($gd, $nimi)) {
      $_POST["kuva"] = $nimi;
    }
  }
}

if ($_POST["kuva"] === null) {
  die("Kuvan lähetys epäonnistui.");
}

Selkeitä lisätietoja esimerkiksi virheiden käsittelystä on koodivinkissä, joka siis pitäisi lukea ja opetella ajatuksella eikä vain yrittää kopioida sellaisenaan.

muuskanuikku [27.11.2022 12:30:06]

#

GD-kirjaston tuottama kuvanlaatu on karmeaa roskaa varsinkin kuvan kokoa muuttaessa. Yksi tärkeä asia, mikä tulee huomioida PNG-kuvia JPEG:ksi muuntaessa on PNG:n tuki läpinäkyvälle taustalle. Jos vain muuntaa kuvan JPEG:ksi ilman mitään muuta käsittelyä, läpinäkyvyys korvautuu mustalla värillä. Yleensä odotamme valkeaa taustaväriä tai esimerkiksi shakkilautakuviota.

Sopetus [20.11.2023 16:17:10]

#

Kuinka tuon yllä olevan kuvan latauksen voisi saada tähän esimerkkiin toimivaksi?
Haluasin kuvien myös menemään tiettyyn hakemistoon.
Olen yrittänyt siihen lisätä move_uploaded_file. Sain joskus toimimaan, mutta en enään. Ongelmana nyt menee hakemistoon sekä samaan jossa koodi tiedosto.

$nimi = $_POST['nimi'];
$hinta = $_POST['hinta'];

$kysely = $yhteys->prepare("INSERT INTO tuotteet(nimi,hinta,kuva) VALUES(:nimi, :hinta, :kuva)");
$kysely->bindparam(":nimi",$nimi);
$kysely->bindparam(":hinta",$hinta);
$kysely->bindparam(":kuva",$kuva);
$kysely->execute();

Jaska [22.11.2023 16:58:22]

#

Metabolix kirjoitti:

Sopetus kirjoitti:

Option toiminnolle ei ole käyttöä, eikä siinä ole insert tietokantaan.

Vai niin. Ei luulisi tämän olevan ongelma, kun tietokantakoodi sinulla jo näyttää olevan ja valikon voit helposti poistaa. Meinasithan kuitenkin itse ohjelmoida jotain etkä pelkästään kopioida valmiita koodeja? (Muista lisenssit: mitään koodia ei saa kopioida ilman lupaa.)

Eikö tuo mene siten, että jos koodi ei saa tekijänoikeussuojaa niin sitä saa käyttää vapaasti? Jos koodi saa tekijänoikeussuojan, niin koodin lisenssistä selviää, miten koodia voi käyttää. Jos tekijänoikeussuojatussa koodissa lisenssiä ei ole, niin varmaankin ohjelmakoodin käyttöön liittyy jotkut perusoikeudet.

En oikein usko, että voisin tehdä pienen lisenssioimattoman ohjelman, joka ei saisi tekijänoikeussuojaa ja rahastaa sen käytöstä tekijänoikeusmaksuja.

Kysyin aikoinaan tästä sivulta https://tekijanoikeus.fi/

Grez [22.11.2023 17:31:19]

#

Jaska kirjoitti:

Eikö tuo mene siten, että jos koodi ei saa tekijänoikeussuojaa niin sitä saa käyttää vapaasti?

Kyllä. Ja tekijänoikeuden suojan koodi saa automaattisesti, jos se ylittää teoskynnyksen, eli jos teos on tekijänsä henkisen luomistyön itsenäinen ja omaperäinen tulos.

Jaska kirjoitti:

Jos koodi saa tekijänoikeussuojan, niin koodin lisenssistä selviää, miten koodia voi käyttää. Jos tekijänoikeussuojatussa koodissa lisenssiä ei ole, niin varmaankin ohjelmakoodin käyttöön liittyy jotkut perusoikeudet.

Niin, lähtökohtaisesti tekijällä on täysi oikeus määrätä teoksensa käytöstä. Eli jos tekijä ei anna lupaa, niin sitä ei lähtökohtaisesti saa muut käyttää. Jos tekijä kirjoittaa lisenssin, niin se käytännössä on tekijän antama lupa käyttää teosta lisenssin puitteissa. Jos lisenssiä ei ole, niin silloin ei ole lupaakaan.

Joillekin teoksille tekijänoikeuslaki antaa luvan (ilman tekijän suostumustakin siis) ottaa kopio yksityiseen käyttöön, mutta tämä ei koske esimerkiksi tietokoneohjelmia.

Jaska kirjoitti:

En oikein usko, että voisin tehdä pienen lisenssioimattoman ohjelman, joka ei saisi tekijänoikeussuojaa ja rahastaa sen käytöstä tekijänoikeusmaksuja.

En ole ihan varma mitä haluat tässä sanoa. Mutta jos tarkoitit että mikäli tekisit esimerkiksi niin pienen ohjelman, että se ei ole lainkaan omaperäinen, eikä näinollen ylittäisi teoskynnystä, niin silloin se tosiaan ei saisi tekijänoikeuden suojaa eikä silloin voisi oikeusteitse "rahastaa" sitä ilman lupaa käyttäviä.

Toki se milloin teoskynnys ylittyy on vähän silleen veteen piirretty viiva.

Metabolix [22.11.2023 17:44:38]

#

Sopetus kirjoitti:

Kuinka tuon yllä olevan kuvan latauksen voisi saada tähän esimerkkiin toimivaksi?

Tästä ei käy ilmi, mikä ongelma sinulla on. Ainoa selkeä puute nyt näkyvillä olevissa palasissa on se, että et sijoita kaikkia arvoja oikeisiin muuttujiin. Sen verran on kyllä pakko osata ohjelmoida, jos aikoo yhtään ohjelmaa tehdä ja ylläpitää. Muilta osin koodin saa toimivaksi ihan vain kopioimalla oikeat palaset peräkkäin.

Sopetus kirjoitti:

Haluasin kuvien myös menemään tiettyyn hakemistoon.

Kuvatiedoston nimi luodaan kohdassa $nimi = ..., ja tähän voi tietysti lisätä alkuun myös hakemiston.

Jaska [22.11.2023 17:52:36]

#

Grez kirjoitti:

Joillekin teoksille tekijänoikeuslaki antaa luvan (ilman tekijän suostumustakin siis) ottaa kopio yksityiseen käyttöön, mutta tämä ei koske esimerkiksi tietokoneohjelmia.

Joo, paitsi jos kyseessä on tekijänoikeuslain kohta 25 j §. Saamani vastauksen mukaan laillisesti hankittua ohjelmaa saa kopioida ja muokata sen verran, että ohjelman saa toimimaan aiottuun tarkoitukseen, mutta liian suuria muutoksia koodiin ei voi tehdä.

Grez [22.11.2023 20:27:35]

#

No siis kuvittelin että tässä puhuttiin siitä, että kopioi koodia jostain ohjelmasta omaan ohjelmaansa - ei ohjelman saattamisesta käyttökuntoon ja varmuuskopioinnista.

Sopetus [23.11.2023 11:13:46]

#

Lisäsin tällaisen vuosi sitten kuvan lataukseen.

$nimi = "kuva_" . hash("sha256", $data) . ".jpg";
move_uploaded_file($_FILES["kuva"]["tmp_name"], "kuva/" . $nimi);

Ongelmana on menee hakemistoon ja myös samaan hakemistoon, jossa koodi tiedosto. Kuinka tehdään, että siirtää kuvan haluttuun hakemistoon?

qeijo [24.11.2023 16:36:19]

#

Jesus

Metabolix [24.11.2023 18:27:54]

#

Koodiin ei kannata lisätä funktiota move_uploaded_file, vaan kuva tallennetaan tuossa jo imagejpeg-funktiolla (jotta muoto on varmasti jpg), joten voit lisätä haluamasi hakemiston nimeen kyseisellä rivillä.

Lisäksi ehkä huomaat, että tiedostoa käsittelevässä koodissa käytetään muuttujaa $nimi, jolloin tämä muuttuja ei sisällä enää tuotteen nimeä tuolla tietokantaosiossa. Sinun pitää hakea tiedot $_POST-taulukosta vasta oikeassa kohdassa koodia.

Tietysti vielä parempi olisi tehdä kuvan tallennus vaikka omassa funktiossa, niin tällaista ongelmaa ei pääsisi syntymään. Voisitkin seuraavaksi selvittää PHP-oppaista, miten funktioita kirjoitetaan, tai pyytää vaikka ChatGPT:tä neuvomaan, miten tiedoston tallennuksesta saisi funktion.

Kaikkiin tarvitsemiisi vaiheisiin on varmasti myös huippuhienoja ja monipuolisia kirjastoja, mutta toisaalta jos näin lyhyen koodin soveltaminen on vaikeaa, ehkä ei kannata haukata liian suurta palaa.

Lebe80 [26.11.2023 22:12:55]

#

Itseä ehkä mietityttää, miksi tässä on lähdetty alunperinkin koodaamaan itse, jos perustaidot on vielä hakusessa.

Eikö erilaisia ilmaisia julkaisujärjeatelmiä ole netti pullollaan, jolla "tuote-editori" onnistuisi pakasta vetämällä

noutti [11.12.2023 14:42:33]

#

Kannattaa käyttää cloudinarya. Heillä on PHP:lle kirjasto jo valmiiksi, sekä skaalaa kuvat parametreilla


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta