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; }
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.
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; } ?>
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']);
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.
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?
utf8_encode toimintoa voisit katsoa tai suoraan laitat koodin sekaan utf8sina...
Voit vaihtaa tuon strtolowerin suoritettavaksi ennen str_replacea niin voit tiputtaa korvaustaulukosta isojen merkkien korvaukset pois.
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..
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.
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!
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; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.