webForumDet fria alternativet

Byta ut otillåtna filtecken?

PHP

16 svar · 2 554 visningar · startad av Bäckman

Medlem sedan nov. 2001274 inlägg
Frågan#1

Hejsan.

Jag håller på med en uploadfunktion. När en användare laddar upp en fil så ska den döpas om, och i filnamnet så ska användarnamnet på den som laddar upp filen ingå.

Mitt problem är att om man försöker ladda upp en fil med användarnamnet "Åke Vader" t.ex. så går filen inte att ladda ned sen p.g.a. Å:et. :)

Jag skulle vilja byta ut alla förbjudna bokstäver på ett snabbt och smidigt sätt. Ni får också gärna upplysa mig om vilka tecken som är tillåtna att ha i filnamn, och vilka som inte är det.

Medlem sedan sep. 20011 086 inlägg
#2

$newName = preg_replace('/[^a-z0-9_-\.]/i', '', $name);
tar bort alla tecken som inte är a-z, 0-9, -, _ och .
De teknena borde vara tillåtna iaf.
Vilka som är tillåtna beror nog på vilket OS servern kör.
Tänk på att kolla så att du inte får ett tomt filnamn...

Medlem sedan nov. 2001274 inlägg
#3

Verkar kunna bli lite klurigt det där. Kanske bättre att köra den kollen på användarnamnen istället, så att man inte kan registrera ett konstigt namn.

Tack för kodsnutten iaf, den kommer till användning.

Medlem sedan juni 20008 205 inlägg
#4

Re: Byta ut otillåtna filtecken?

Bäckman skrev:

Mitt problem är att om man försöker ladda upp en fil med användarnamnet "Åke Vader" t.ex. så går filen inte att ladda ned sen p.g.a. Å:et. :)

Jodå, det går visst, bara man URL-kodar Å:et i länken.

Medlem sedan mars 200334 inlägg
#5

eller så kan du använda urlencode() det gör jag.
ex:
$foo = Ä Ä;
echo urlencode($foo);
blir typ %AE%20%AE

Medlem sedan feb. 20034 441 inlägg
#6

Har den här funktionen för att skapa "snygga" filnamn:

function fixname($fname = ""){
	$match    = array('Å', 'Ä', 'Ö', 'å', 'ä', 'ö', ' ');
	$replace  = array('a', 'a', 'o', 'a', 'a', 'o', '_');
	
	$fname = strtolower($fname);
	$fname = str_replace($match, $replace, $fname);
	return preg_replace('/[^a-z0-9\._\-]/i', '', $fname); 
}

Men åäö ÅÄÖ tas bort helt och ersätts in av aao AAO. Kommenterar jag bort preg_replace() så står det ändå åäö ÅÄÖ i namnet.

Vad är fel? Kan det ha med teckenkodning att göra?

Medlem sedan juni 20006 031 inlägg
#7

Detta bör fungera

function fixname($fname){
    $match    = array('Å', 'Ä', 'Ö', 'å', 'ä', 'ö', ' ');
    $replace  = array('a', 'a', 'o', 'a', 'a', 'o', '_');
    return str_replace($match, $replace, $fname);
}  

echo fixname('Åke Östangård');

/red
Osäker på andra system, men i Windows är följande tecken ogiltiga i filnamn.
< > : " / \ | ? *

Medlem sedan feb. 20034 441 inlägg
#8

Pedda skrev:

Detta bör fungera

function fixname($fname){
    $match    = array('Å', 'Ä', 'Ö', 'å', 'ä', 'ö', ' ');
    $replace  = array('a', 'a', 'o', 'a', 'a', 'o', '_');
    return str_replace($match, $replace, $fname);
}  

echo fixname('Åke Östangård');

/red
Osäker på andra system, men i Windows är följande tecken ogiltiga i filnamn.
< > : " / \ | ? *

Nej, blir exakt samma sak. Men det kvittar egentligen, eftersom jag måste ha min preg_replace för att andra specialtecken osv. ska tas bort.

Sitter just nu och testar på Apache på Windows, spelar det någon roll?

Medlem sedan juni 20006 031 inlägg
#9

Testade också nu på Apache och Windows.
Funkar fint för mig.

Medlem sedan feb. 20034 441 inlägg
#10

Testa gärna det här på din server där det funkar:

function fixname($fname = ""){
	$match    = array("Å", "Ä", "Ö", "å", "ä", "ö", " ", "  ");
	$replace  = array("a", "a", "o", "a", "a", "o", "_", "__");
	
	$fname = strtolower($fname);
	$fname = str_replace($match, $replace, $fname);
//	$fname = preg_replace('/[^a-z0-9\._\-]/i', '', $fname); 
	return $fname;
}

if($handle = opendir("./galleri")) {
	$files = array();
	$notlisted = array(".", "..");
	while (false !== ($file = readdir($handle))) {
		$path_parts = pathinfo($file);
		if(!in_array($file, $notlisted)){
			echo fixname($file) . "<br />";
		}
	}
}

Har det med att göra att jag listar filer? Det jag ska göra är att "indexera" bilder i en mapp och döpa om alla m.h.a rename() men först måste jag få det här att fungera.

Ska testa senare hur det blir om jag kör det under FreeBSD.

Medlem sedan juni 20006 031 inlägg
#11

Funkade inte för mig heller när man loopade filer.
Löste det med htmlentities().

<?php 
function fixname($fname){
    $match    = array('&aring;', '&auml;', '&ouml;', ' ');
    $replace  = array('a', 'a', 'o', '_');
    return str_replace($match, $replace, strtolower($fname));
} 

if($handle = opendir("./galleri")) {
    $files = array();
    $notlisted = array(".", "..");
    while (false !== ($file = readdir($handle))) {
        $path_parts = pathinfo($file);
        if(!in_array($file, $notlisted)){
            echo fixname(htmlentities($file)) . "<br />";
        }
    }
}  
?>
Medlem sedan feb. 20034 441 inlägg
#12

Aha! Då kanske det beror på att koden är UTF-8 och att filsystemet kör nån annan kodning? Ska prova, tack!

Medlem sedan juni 20006 031 inlägg
#13

Om det fungerar för dig så kan du markera rätt svar med "Markera som lösning" så är det lättare för andra med samma problem att hitta lösningen.

Medlem sedan feb. 20034 441 inlägg
#14

Pedda skrev:

Om det fungerar för dig så kan du markera rätt svar med "Markera som lösning" så är det lättare för andra med samma problem att hitta lösningen.

Hade jag självklart gjort, om det var jag som startat tråden från början :)
Sökte innan och "kapade" den här istället för att skapa en egen.

Medlem sedan juni 20006 031 inlägg
#15

Missade det. (y)
Hoppas att det fungerar för dig iaf. :)

Medlem sedan aug. 200929 inlägg
#16

Är det inte bättre att sätta ut ID:n på användaren ist för användarnamnet...? tänker mig att det kanske kan bli stora fel i längden annars.

Medlem sedan feb. 20034 441 inlägg
#17

Illius skrev:

Är det inte bättre att sätta ut ID:n på användaren ist för användarnamnet...? tänker mig att det kanske kan bli stora fel i längden annars.

Va?

/r Jaha, du menar ursprungsinlägget, trodde du syftade på något jag skrev tidigare.

263 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)