Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Lomakkeen tiedot PHP:llä PDF-muotoon

verkko2022 [12.03.2022 12:36:08]

#

Olen pommittanut aika monilla kysymyksillä ja ennen kuin rauhoitun, niin kysyn vielä tätä.

Olen tehnyt lomakkeita ja ohjannut niitä mm. sähköpostiini

<form action="viesti.php" method="post">

Mitä jos en haluaisikaan lähettää niitä sähköpostiini, vaan tallentaa ne verkkosivuillani olevaan kansioon .pdf muodossa. Vielä pitäisi huomioida tietoturvakin. Tätä en osaisi tehdä itse, vaikka käyttäisin siihen seuraavat tuhat vuotta:-D

Grez [12.03.2022 14:04:00]

#

verkko2022 kirjoitti:

Mitä jos en haluaisikaan lähettää niitä sähköpostiini, vaan tallentaa ne verkkosivuillani olevaan kansioon .pdf muodossa.

No sitten teet niin.

verkko2022 kirjoitti:

Vielä pitäisi huomioida tietoturvakin. Tätä en osaisi tehdä itse, vaikka käyttäisin siihen seuraavat tuhat vuotta:-D

Tässä tapauksessa kannattaa ehkä hommata joku muu tekemään niitä sivuja. Lähtökohtaisesti verkkosivuja ei kannata julkaista ennen kuin tietoturva-asiat on kunnossa.

Metabolix [12.03.2022 14:07:22]

#

Argh, miksi PDF-muodossa? Mutta oletko edes kokeillut hakusanoja ”how to create PDF with PHP”?

”Vielä pitäisi huomioida tietoturvakin”, no ensin sinun pitää määritellä, mikä on tarpeellinen ja riittävä tietoturva. Asiaa helpottaa, jos omaksut sen aikaisemmin ehdotetun ajatuksen, että tiedostot sijaitsevat täysin piilossa ja kaikki tieto välitetään PHP:n läpi. Silloin voit helposti tehdä kirjautumisen tunnuksella ja salasanalla ja istunnoilla.

Jos et käsittele mitään arvokasta tai salassa pidettävää (kuten henkilötietoja), purkkaratkaisuna varmaan riittää se, että käytät tiedostonimenä aikaleimaa ja satunnaista osaa ja ohjelmoit tarkastuksen siihen väliin, että tiedostolistaa ei pääse lukemaan ilman salasanaa.

Kyseinen purkkaratkaisu voisi näyttää tältä:

<?php
// Mallin vuoksi laitan tiedot vain tekstimuotoon. Etsi itse jokin PDF-kirjasto.
$tiedot = "";
foreach ($_POST as $k => $v) if (is_string($v)) {
	$tiedot .= "$k\n\n$v\n\n";
}

// Tallennetaan aikaleiman mukaan. Satunnainen osa estää arvaamisen.
$tiedosto = "viestit/" . date("Y-m-d H.i.s ") . bin2hex(random_bytes(16)) . ".txt";
file_put_contents($tiedosto, $tiedot);
<?php
if ($_POST["salasana"] != "kissa2") {
	http_response_code(403);
	die("Ei pääsyä!");
}

foreach (glob("viestit/*.txt") as $f) {
	$u = "viestit/" . rawurlencode(basename($f));
	$s = htmlspecialchars($f);
	echo "<li><a href='$u'>$s</a></li>";
}

muuskanuikku [17.03.2022 08:43:50]

#

Tietoja ei yleensä kannata tallentaa palvelimelle vaikeasti käsiteltävissä muodoissa kuten PDF-tiedostot tai "Excel-taulukot". Sen sijaan on parempi luoda uusi ladattava tiedosto dynaamisesti aina käyttäjän sellaista pyytäessä. Levylle ns. cachettamista tarvitaan vasta sitten, kun palvelulla on niin paljon käyttäjiä latailemassa tiedostoja, että palvelinten kuormitus alkaa kasvaa kohtuuttomasti sen vuoksi.

Dynaamisessa luonnissa on sekin etu, että jos PDF:n ulkoasua tai asettelua tarvitsee muuttaa, niin sitten se muuttuu lennosta kaikille ladattaville tiedostoille sen sijaan, että joutuisit yhtäkkiä generoimaan kaikki levylle aiemmin tallennetut tiedostot uusiksi päivittääksesi uudet tyylit niihinkin.

Tallennetuissa tiedoissa voi olla myös jokin kiusallinen kirjoitusvirhe automaattisesti tuotetussa tekstinosassa.

verkko2022 [18.03.2022 11:19:00]

#

Hei ja kiitos viestistäsi. Voisitko sinä auttaa minua tähän asiaan liittyen. Minulla ei ole pakkomiellettä pdf-tiedostoihin, mutta.... :-D

Minulla on tällainen koodi:

header("Content-Type: application/pdf");
header("Content-Disposition: inline; filename=". $tiedosto);
#header("Content-Disposition: attachment; filename=". $tiedosto);
header("Content-Length: " . filesize($polku));
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
readfile($polku);
      exit();

Tämä toimii todella hyvin pdf-tiedostoilla. Mikäli haluaisin, että saisin myös .txt tiedostot auki, niin miten korjaisin yllä olevaa??

Tämä koodi on hyvä, kun se avaa pdf-tiedostot suoraan näytölle ilman pakollista tallennusta:-)

verkko2022 [18.03.2022 15:19:16]

#

Tein nyt niin, että käytin vain if lauseketta päästäkseni eteenpäin:-)

Vastaus

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

Tietoa sivustosta