Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedoston nimeäminen

Sivun loppuun

tsehov [28.01.2016 08:34:51]

#

Mikähän olisi kätevin ja yksinkertaisin tapa toteuttaa nettisivulle 'submit' -namikka, joka nimeäsi samassa kansiossa olevan html-tiedoston siten että uudelleen nimetyn tiedoston alkuun tulisi 'date stamp'.

Ilmeisesti PHP tai JavaScript olisivat kykeneviä tähän toimenpiteeseen?

Olen parin päivä ajan kokeillut erilaisia php-scriptejä - joita olen netistä löytänyt - mutta en ole vielä saanut hommaa toimimaan.

Voisiko joku joka on mahdollisesti toteuttanut samankaltaisen toiminnon auttaa avutonta? Itse en todellakaan ole mikään PHP:n enkä suuremmin Javascriptinkään tuntija.

Kiitos jo etukäteen.

Macro [28.01.2016 10:14:09]

#

JavaScriptillä et voi nimetä uudelleen tiedostoja, sillä et voi käsitellä sillä serveripuolen asioita. PHP:llä tosin onnistuu.

Funktiolla rename voit uudelleennimetä tiedoston. date-funktio taas palauttaa päivämäärän haluamassasi muodossa.

Metabolix [28.01.2016 17:20:47]

#

Kysymyksestä varmaan puuttuu jotain olennaista, koska jos tavoitteena on vain nimetä yksi tiedosto uudestaan, ongelma ratkeaa ilman ohjelmointia tiedostoselaimen avulla. Eli onko tarkoitus esimerkiksi tulostaa lista kaikista tiedostoista ja valita siitä käsiteltävä tiedosto, vai mistä oikein on kyse?

Yksinkertainen koodi näyttäisi tältä:

<form action="skripti.php" method="POST">
  <button type="submit" name="tiedosto" value="testi.html">
    Muunna testi.html
  </button>
  <button type="submit" name="tiedosto" value="toinen.html">
    Muunna toinen.html
  </button>
</form>
<?php
// Hyväksy vain oikeat tiedostot, jottei hakkeri pääse iskemään.
$tiedostot = ["testi.html", "toinen.html"];

$tiedosto = @$_POST["tiedosto"];
if (!in_array($tiedosto, $tiedostot)) {
  http_response_code(403);
  die("Tiedostoa ei voi nimetä!");
} elseif (!file_exists($tiedosto)) {
  http_response_code(404);
  die("Tiedostoa ei ole!");
} else {
  rename($tiedosto, date("Y-m-d-").$tiedosto);
  die("OK!");
}

tsehov kirjoitti:

Olen parin päivä ajan kokeillut erilaisia php-scriptejä - joita olen netistä löytänyt - mutta en ole vielä saanut hommaa toimimaan.

Satunnaisten koodien kokeileminen on aika huono lähestymistapa ohjelmointiin. Onko mitään käsitystä, mitä ne kokeilemasi koodit tekevät ja miksi ne mielestäsi eivät toimi? Oletko yrittänyt ratkaista ongelmaa loogisesti esim. sellaisina vaiheina kuin (1) tee lähetysnappi, (2) selvitä tiedoston nimi, (3) selvitä päivämäärä, (4) yhdistä näistä uusi nimi, (5) etsi funktio tiedoston nimen vaihtoon?

Osmo [28.01.2016 17:23:13]

#

Macro kirjoitti:

JavaScriptillä et voi nimetä uudelleen tiedostoja, sillä et voi käsitellä sillä serveripuolen asioita.

Ihan vaan tiedoksi:

https://en.wikipedia.org/wiki/Server-side_JavaScript#Server-side_JavaScript

Macro [28.01.2016 17:56:37]

#

Osmo kirjoitti:

JavaScriptiä on käytetty palvelinpuolella jo yli kaksi vuosikymmentä.

Kysyjän antaman kuvan perusteella tämä tuskin oli kyseessä.

tsehov [29.01.2016 10:33:12]

#

Kiitos kiinnostavista vastauksista. Taisin tosiaan kuvata tarpeeni turhan ylimalkaisesti.

Tilanne on sellainen, että olen tekemässä eräälle yhteisölle (Saamelaiskäräjät) muuatta chat -sovellusta - tai siis en ole itse sitä tehnyt: olen löytänyt sen netistä ja hiukan tarpeen mukaan editoinut sitä. Chat löytyy osoitteesta: http://www.sogku.fi/live. Se toimiikin ihan OK, mutta ongelma on sellainen, että chat kirjaa kaikki kommentit logiin (log.html), ja jotta chat olisi tyhjä jokaisen seminaarin tms.:n jälkeen, pitää jonkun mennä esim. ftp:llä poistamaan/uudelleennimeämään po. logi-tiedosto. Nyt henkilöt, jotka hoitaisivat kyseisen toimenpiteen tarvitsisivat ftp-palvelimemme tunnukset, joita ei kuitenkaan haluta jaella sinne tänne. Toisekseen peruskäyttäjät kokevat ftp:n käytön melko hankalaksi jne.

Haluttaisiin siis nettisivu, johon kirjautumalla (tunnistautuminen esim. htaccessin avulla) henkilö vain klikkaisi nappia (submit), joka nimeäsi uudelleen log.html -tiedoston, jolloin chat toimisi taas ns. puhtaalta pöydältä.

Olen kokeillut muutamia php-skriptejä, joita olen netistä löytänyt mm. seuraavanlaista:

rename (WEB_ROOT."/public_html/testi/log.html", WEB_ROOT."/public_html/testi/log_old.html");

Tuo antaa seuraavaa virheilmoitusta:

[29-Jan-2016 10:30:42 Europe/Helsinki] PHP Warning: rename(WEB_ROOT/public_html/testi/log.html,WEB_ROOT/public_html/testi/log_old.html): No such file or directory in /home2/sogkup4j/public_html/testi/rename.php on line 19
[29-Jan-2016 10:30:49 Europe/Helsinki] PHP Warning: rename(WEB_ROOT/public_html/testi/log.html,WEB_ROOT/public_html/testi/log_old.html): No such file or directory in /home2/sogkup4j/public_html/testi/rename.php on line 19

Eli se ei löydä kyseistä tiedostoa mainitun polun päästä...

Toivottavasti tämä selvitti hiukan, mistä on kysymys.

Kiitos jo etukäteen.

Grez [29.01.2016 11:37:50]

#

Eikös tuossa virheessä selvästi sanota mistä on kyse: palvelimellasi ei ole tiedostoa WEB_ROOT/public_html/testi/log.html

Mistäs tämä sitten johtuu. No varmaankin siitä, että olet käyttänyt vakiota WEB_ROOT määrittelemättä sitä. Eli jos missään ei ole komentoa tyyliin

define('WEB_ROOT', '/home2/sogkup4j');

Niin eihän se voi toimia. PHP tulkitsee että olet vaan halunnut kirjoittaa tekstin WEB_ROOT, mutta unohtanut laittaa lainausmerkit ympärille.

Vaihtoehtoisesti voisit varmaankin laittaa vaan suoraan kiinteät polut

rename ('/home2/sogkup4j/public_html/testi/log.html', '/home2/sogkup4j/public_html/testi/log_old.html');

Ottaen huomioon että skripti on samassa hakemistossa kuin tiedostot, niin yksinkertaisin voisi olla suhteellinen

rename ('log.html', 'log_old.html');

tsehov [31.01.2016 21:08:27]

#

Grez kirjoitti:

Ottaen huomioon että skripti on samassa hakemistossa kuin tiedostot, niin yksinkertaisin voisi olla suhteellinen

rename ('log.html', 'log_old.html');

Suuret kiitokset, yllä oleva määrittely ratkaisi pulman.

Kiitos myös muille apuaan ystävällisesti tarjonneille.

tsehov [01.02.2016 10:42:15]

#

Jaahas, vieläkin tuottaa ongelmia.

Siellä on nyt seuraavanlainen koodi

<?php
$file = 'log.html';
$firstName = 'OLD_log';
$timestamp = time();
rename($file,.$firstName.'-'.$timestamp.'.txt');
?>

Antaa tuollaisen errorin:

[01-Feb-2016 10:41:33 Europe/Helsinki] PHP Parse error: syntax error, unexpected '.' in /home2/sogkup4j/public_html/testi/rename.php on line 5

novari [01.02.2016 10:58:33]

#

Ota $firstName muuttujan edestä piste pois.

tsehov [01.02.2016 11:47:06]

#

Antaa edelleen saman errorin???

HTML5 [01.02.2016 15:15:28]

#

tsehov kirjoitti:

(01.02.2016 11:47:06): Antaa edelleen saman errorin???

Otithan pisteen pois muuttujan $firstName edestä etkä jäljestä?

tsehov [01.02.2016 15:45:11]

#

Juuri noin: edestä poistin pisteen.

Grez [01.02.2016 17:18:02]

#

Ja korjattu koodi, joka edelleen antaa tuon virheilmoituksen on?

tsehov [01.02.2016 20:39:34]

#

Nyt siellä on:

<?php
$file = 'log.html';
$firstName = 'OLD_log';
$timestamp = time();
rename($file, $firstName.'-'.$timestamp.'.txt');
?>

Ja tulos on:

[01-Feb-2016 20:39:06 Europe/Helsinki] PHP Warning: rename(log.html,OLD_log-1454351946.txt): No such file or directory in /home2/sogkup4j/public_html/testi/rename.php on line 5

groovyb [01.02.2016 20:56:29]

#

mitäs tuo virheilmoitus mielestäsi tarkoittaa suomeksi?

tsehov [02.02.2016 06:17:30]

#

No niin, se tarkoittaa ettei siellä hakemistossa ole sen nimistä tiedostoa. Mutta siellä on log.html -niminen tiedosto.

Lisäys: Huomasin äsken oudon seikan ongelmaani liittyen: vaikka errorlog näyttääkin yllä mainitun virheen, kun kirjauduin jonkin ajan kuluttua uudelleen ftp:llä kansioon olikin skripti uudelleennimennyt tiedoston.

groovyb [02.02.2016 08:52:39]

#

Luonnollisesti ekalla kerralla se toimii, toisella ei, koska ei sellaista tiedostoa ole enää.

tsehov [02.02.2016 10:15:57]

#

Niin, mutta kun minä ehdin jo lisätä tiedoston 'log.hml' uudelleen sinne ennen kuin ajoin skriptin.

Macro [02.02.2016 14:41:54]

#

Ei ne virheilmoitukset kyllä tyhjästä ilmesty, että jossain kohtaa olet varmaan tehnyt jotain väärin.

Metabolix [02.02.2016 19:31:22]

#

Mahdolliset virhetilanteet kannattaa huomioida jo koodia tehdessä, jotta virheilmoitukset ovat selvät tai turhia ilmoituksia ei tule. Kokeilepa näin:

<?php
$file = 'log.html';
$file2 = 'OLD_log-' . date('Y-m-d_H.i.s') . '.txt';

if (!file_exists($file)) {
  echo "Tiedostoa $file ei ole.\n";
} elseif (!@rename($file, $file2)) {
  echo "Siirto epäonnistui!\n";
} else {
  echo "Siirto onnistui. Nimi: $file2\n";
}

tsehov kirjoitti:

Antaa edelleen saman errorin???

Jos nyt vähän siristät silmiäsi, niin ei kai se nyt ihan sama ollut? "Parse error" vs. "No such file"...

tsehov [02.02.2016 21:58:19]

#

Kiitos taas avusta.

Kopioin Metabolixin laittaman tekstin skriptiin, ja se vastaa (selaimessa): 'Tiedostoa log.html ei ole.' Todellisuudessa siellä on tismalleen tuon niminen tiedosto ('log.html').

Parin testauksen tuloksena skripti teki juuri halutun toimenpiteen - ja ilmoittikin siirron onnistuneen, mutta uudelleen testailtuani taas sama ongelma: 'Tiedostoa log.html ei ole.' vaikka olen tiedoston sinne kopioinut uudelleen.

Kuuluuko asiaan, että toiminnon suorittamisessa on jonkinlainen muutaman minuutin viive?

Metabolix [02.02.2016 23:14:28]

#

Olen itsekin nähnyt (nic.fi-palvelimilla) tuollaisen jännän synkronointiongelman FTP:n ja PHP:n välillä. Se ei kuulu asiaan, mutta asialle ei voi mitään (paitsi hankkia paremman palvelimen tai valittaa asiakaspalveluun). Ehkä viisainta on unohtaa koko FTP ja käyttää sen sijaan jotain PHP:llä toteutettua tiedostonhallintaa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta