Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Upload tiedoston nimenmuokkaus ja kielletyt merkit (PHP)

Sivun loppuun

anieme [16.07.2006 13:51:48]

#

Oon kehitellyt sivuhallintajärjestelmää tässä jo tovin, mutta yhteen ongelmaan ei tunnu löytyvän ratkaisua. Haluan karsia lähetettyjen tiedostojen tietyt merkit ja muuttaa ne toisiksi.

Olen tehnyt tuota varten funktion "muokkaa_tiedostonimi" - se toimii hienosti hallintajärjestelmän "muuta nimi" osuudesta kutsuttaessa, mutta uploadauksessa merkit ei muutu, paitsi pieniksi kirjaimiksi. Missähän vika? Osaisko joku neuvoa?

Tiedoston lähetys, josta kutsutaan funktioo.

if(isset($send))
{
	$file_name = $HTTP_POST_FILES["sendedfile"]["name"];
	$filename = muokkaa_tiedostonimi($file_name);

	copy($sendedfile,$root.$filename);
	echo "<hr /><p>Tiedosto ".$filename." on tallennettu.</p>";
}

Funktio, jossa merkkien tulisi vaihtua

function muokkaa_tiedostonimi ($newfile) {
	$newfile = stripslashes($newfile);

	$kielletyt = array('ä', 'Ä', 'ö', 'Ö', 'å', 'Å', ' ', '#', '!', '%', '&', '(', ')', '*', '¨', '\\','@', '\'');
	$korvaavat = array('a', 'a', 'o', 'o', 'a', 'a', '_', '-', '', '', '', '', '', '', '', '','','');
	$newfile = str_replace($kielletyt, $korvaavat, $newfile);

	$newfile = strtolower($newfile);
	return $newfile;
}

Jaska [16.07.2006 14:29:40]

#

Törmäsin itsekin töissä jokin aika sitten samaan ongelmaan. Aika aloittelija ole PHP:ssä, mutta luulisin, että str_replace korvaa merkkijonoja toisilla, ei taulukoita. Muuta koodia siten, että muunnat merkin kerrallaan toiseksi.

tsuriga [16.07.2006 14:30:33]

#

Kyllä se imee taulukoitakin, lukekaa manuskaa.
-Sended -> sent.
-Kokorajoitus
-Päällekirjoituksen esto

Tässä omasta scriptistä muokattu.

<?php
define ('MAX_SIZE', 102400000);

if (isset($_POST['send'])) {
  if($_FILES['sentfile']['size'] > MAX_SIZE) die ("Liian iso tiedosto!");
  $filename = muokkaa_tiedostonimi($_FILES['sentfile']['name']);
  if(file_exists($filename)) die("Tiedosto ".$filename." on jo serverillä");
  if (move_uploaded_file($_FILES['sentfile']['tmp_name'], $filename)) echo "Tiedosto lisättiin onnistuneesti serverille nimellä ".$filename;
  }
?>

anieme [16.07.2006 15:32:15]

#

Kiitos nopeasta vastauksesta, ja hyvistä vinkeistä!.. mutta valitettavasti kirjaimet ei edelleenkään vaihdu, muuta kuin pienellä kirjoitetuksi. Mikä voi olla? :/


ps. jos joku muu seurasi tsurigan vinkkiä niin tuosta yhdeltä riviltä taisi unohtua sulku kiinni ) eli:

$filename = muokkaa_tiedostonimi($_FILES['sentfile']['name']);

tsuriga [16.07.2006 16:16:08]

#

Hjoo niin jäi. On se vaan niin kätevää ettei voi muokata vanhaa viestiä. Mikäs php:n versio alla? Arrayt parametreina mahdollistuivat versiosta 4.0.5 ylöspäin. Ainakin tuo funktio pelittää omalla 4.3.9 versiolla kuin pitääkin.

anieme [16.07.2006 16:37:12]

#

Joo.. PHP versio on : 4.3.10, eli pitäis toimia funktion - ja toimiikin kun käytän samaa "Muuta nimi" osiossa. Eli sillon se muuttaa esim. noi ääkköset aakkosiks ihan oikein. Jostain syystä ei vaan uploadissa muuta tiedoston nimee, paitsi strtolower():n se bongaa sieltä.

En pysty ymmärtään tätä :/

Edit: Huomasin että PC&Windows yhdistelmällä homma toimii, mutta Macin kanssa tahmaa, eli mitä hittoa? :) win käyttää ISO-8859-1 vissiin ja Mac OS X UTF-8 tiedostonimissä - onko se siitä? miten ton voi korjata?

Niko [16.07.2006 18:39:08]

#

utf8_encode toimintoa voisit katsoa tai suoraan laitat koodin sekaan utf8sina...

tsuriga [16.07.2006 19:30:42]

#

Voit vaihtaa tuon strtolowerin suoritettavaksi ennen str_replacea niin voit tiputtaa korvaustaulukosta isojen merkkien korvaukset pois.

anieme [16.07.2006 22:15:45]

#

utf8_encode() ei tuntunut auttavan.. ainakaan mun yrityksellä (myös utf8_decode():lla tuli koitettua).

Pitääkin siirtää se strtolower - se olikin vasta myöhempi lisäys niin tuli laitettua vähän huonoon paikkaan. Kiitoksia jälleen!

Ihmettelen kyllä edelleen ongelmaa, eihän PHP:n pitäis riippua käyttäjäkoneesta, mutta toki formiin voi syöttää kaikenlaista.. Jos joku keksii ratkaisua tai edes vinkkejä mitä vois koittaa ratkaisuksi niin auttais paljon..

Niko [16.07.2006 23:18:28]

#

voit kokeilla myös muuttaa merkistön sopivaks multibyte string kirjastolla: https://www.php.net/manual/fi/ref.mbstring.php, jota ei valitettavasti löydy kaikista hosting palveluista.

anieme [17.07.2006 11:02:41]

#

Tuli puhuttuakin liian ajoissa, ko. koodi toimii Macilläkin jos selaimena on Firefox tai Camino. Mutta esim. Opera & Safari skippaa kirjainmuutoksen jostain tuntemattomasta syystä. Eli ongelma taitaa olla liian vaikee ratkaistavaksi..

Kiitän avuista, nyt toimii ainakin suurella osalla!

anieme [17.07.2006 12:51:26]

#

Ongelma ratkesi, kun vein hommaa pidemmälle! ..jokin käsin syöttämistäni 'kielletyistä' merkeistä ei ollut 'yhteensopiva' Safarin/Operan kanssa. Korvasin funktioo siis malliin:

function muokkaa_tiedostonimi ($newfile) {
	$newfile = stripslashes($newfile);
	$newfile = strtolower($newfile);

	$kielletyt = array('ä', 'ö', 'å', ' ', '#');
	$korvaavat = array('a', 'o', 'a', '_', '-');
	$newfile = str_replace($kielletyt, $korvaavat, $newfile);

	$newfile = preg_replace('#[^a-z0-9.]#', '', $newfile);

	return $newfile;
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta