webForumDet fria alternativet

Ersätta å, ä, ö samt mellanslag med tecken?

PHP

16 svar · 1 667 visningar · startad av patrikdanielsso

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

Hej,

Jag har hittat ett gammalt PHP-script på internet, på något forum som listar alla mappar och filer i en viss mapp som man anger.

Det funger faktiskt helt okej, förutom att å, ä, ö och mellanslag i filerna och mapparna skrivs ut, och då vill inte alla webbläsare hitta filen.

Så här ser det ut i koden som ska skriva ut:

<a href="{$_SERVER.PHP_SELF}?download={$cwd}{$file.name}" target="_blank">{$file.name}</a>

Och här är koden för anropet:

if ($_REQUEST['download']) {
	$basepath = realpath(FILE_PATH).'/';
	$filepath = realpath(FILE_PATH.urldecode($_REQUEST['download']));
	if (substr($filepath,0,strlen($basepath))!=$basepath) die('Invalid filename');

	if (!is_readable($filepath)) die('Cannot access file');

	if ( (!defined('FILE_URI')) || (!FILE_URI) ) {
		send_file($filepath);
	} else {
		$uri = FILE_URI.substr($filepath,strlen($basepath));
		Header('Location: '.$uri);
	}

	die;
}

Kan man på något enkelt sätt lägga in så att å ä ö och mellanslag ersätta med de korrekta html-tecken i länken?

Jag är rätt ny på PHP så var snäll mot mig :bire

Medlem sedan nov. 201023 inlägg
#2

Eller kan någon förklara varför det går att ladda ner en fil i firefox, men inte via Internet Explorer? IE tar bort alla å ä ö från adressraden, medans firefox ersätter dom med HTML-tecken.

Medlem sedan sep. 20088 inlägg
#3

I PHP så finns funktionerna urlencode och htmlspecialchars som passar (spec urlencode) för detta och liknande ändamål.

Men koden du pastear överst ser ut att vara i template-form skrivet för smarty eller liknande system, och därför kan det vara användbart att använda sig av modifiers för just urlencode i detta fall. Om jag minns rätt så bör följande kodstycke eventuellt lösa ditt problem:

<a href="{$_SERVER.PHP_SELF}?download={$cwd|urlencode}{$file.name|urlencode}" target="_blank">{$file.name|htmlspecialchars}</a>
Medlem sedan nov. 201023 inlägg
#4

Tack för svaret.

Jag provade den där koden, och den ersätter numera mellanrum med +, och då hittar den inte filen heller verkar det som. Jag kan inte begripa varför originalkoden funkar så himla bra med firefox, safari och andra webbläsare, men inte med IE.

Medlem sedan sep. 20088 inlägg
#5

Problemet ligger delvis i hur länkarna ges men även i teckenkodning för sidan. Är lite svårt att säga mer utan direkt sikt över helheten.

Medlem sedan nov. 201023 inlägg
#6

Jag använder iso-8859-1 idag, är utf-8 bättre? Dessutom har jag läst att det kan ha betydelse för hur man laddar filerna, i vilket program.

Medlem sedan sep. 20088 inlägg
#7

Vilken teckenkodning du använder dig av spelar mindre roll så länge de tecken du nyttjar finns stödda. Däremot så kan webbläsare tolka din sida olika om du har dåligt definerad teckenkodning. Jag säger inte att det är här som problemet ligger, men det är inte en alltför ovanlig anledning. Det borde dock vara fler fel än denna länk på sidan om så är fallet.

Ett snabbt sätt att kontrollera detta är att visa sidinformationen i de webbläsare som sidan fungerar i, och jämföra vad de anser att det är för teckenkodning mot de webbläsare som sidan inte fungerar i. Om båda överensstämmer med vad din kod använder och rapporterar för teckenkodning så ligger inte problemet här.

I övrigt så bör åäö ha blivit satta till korrekta %-värden i länken. Har du tittat i källkoden för den producerade länken?

Medlem sedan nov. 201023 inlägg
#8

Låt mig ge ett exempel.

Denna länk klickar jag på i både FF och IE:

index.php?download=/Säkerhetsdatablad/Övrigt/Aceton.pdf

FF genererar då följande och PDF:en visas korrekt:

/S%E4kerhetsdatablad/%D6vrigt/Aceton.pdf

Medans IE genererar följande och PDF:en hittas inte:

/Skerhetsdatablad/vrigt/Aceton.pdf

I FF kollar jag på egenskaper för min hemsida:
Renderingsläge: Strikt enligt standard
Kodning: ISO-8859-1

I IE hittar jag inte vart man ser denna informatio, men högerklickar jag ser jag att Västeuropeiska (ISO) är valt per automatik.

Medlem sedan sep. 20088 inlägg
#9
urlencode('/Säkerhetsdatablad/Övrigt/Aceton.pdf'); // genererar: %2FS%C3%A4kerhetsdatablad%2F%C3%96vrigt%2FAceton.pdf

Använd urlencode.

Medlem sedan nov. 201023 inlägg
#10

Nu provade jag följande:

<a href="{$_SERVER.PHP_SELF}?download={$cwd|urlencode}{$file.name|urlencode}" target="_blank">{$file.name}</a>

Den genererar då följande länk:

index.php?download=%2FS%E4kerhetsdatablad%2F%D6vrigt%2FAceton.pdf

FF funkar fint som vanligt, IE hittar inte filen:

/Skerhetsdatablad/vrigt/Aceton.pdf

Uppskattar hjälpen!

Medlem sedan nov. 201023 inlägg
#11

Jag vill också tillägga att jag har följande kod i början av index.php, om det är till någon hjälp.

<!DOCTYPE html 
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sv" lang="sv">
<head>
	<title>File Manager</title>
	<link rel="stylesheet" type="text/css" href="style.css" />
</script>
	<meta http-equiv="content-type" content="text/xhtml-xml; charset=iso-8859-1">
</head>
Medlem sedan sep. 20088 inlägg
#12

Kom precis på, om du skickar med non-ASCII i $uri så kan följande rad orsaka problemet:

Header('Location: '.$uri);

Har du tur så löser urlencode($uri) problemet men misstänker att så ej är fallet. Nåja, bara att läsa upp dokumentation för header.

Medlem sedan nov. 201023 inlägg
#13

Hur menar du med "läsa upp dokumentation för header"? Jag är rätt ny på PHP, så jag lär mig fortfarande.

Medlem sedan nov. 201023 inlägg
#14

Hittade denna när du nämnde header:

	header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
	header("Cache-Control: no-store, no-cache, must-revalidate");
	header("Cache-Control: post-check=0, pre-check=0", false);
	header("Pragma: no-cache");
	header('Content-type: ' . get_file_mimetype($filepath));
	if (!$inline) header('Content-Disposition: attachment; filename="'.$filename.'"');
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".filesize($filepath));

Kan detta ha något att göra med mitt problem?

Medlem sedan sep. 20088 inlägg
#15

Som sagt, lite svårt att lösa något med bara fraktioner av systemet. Men min nuvarande gissning ligger på att du nu har ett problem med följande rad kod (se din första post):

Header('Location: '.$uri);

Det går inte riktigt att skicka med vilka tecken som helst till header() hur som helst.

Medlem sedan nov. 201023 inlägg
#16

Okej, och du har ingen tips på hur man kan lösa det? Någon speciell kod du behöver se? Man blir lätt galen när man försökt med alla knep känns det som.

Det som stör mig mest är att det bara verkar vara problem med IE, inte med någon annan webbläsare.

Medlem sedan nov. 201023 inlägg
#17

Det verkar som att urlencode även gör om "/" till html-tecken, vilket är synd då det blir fel. Kan man göra så att urlencode inte omvandlar just /?

360 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
222 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
222 ms — ändringar (db)