Dynamisk sida med pdf-filer

Tråden skapades och har fått 22 svar. Det senaste inlägget skrevs .
1

Jag bygger en sajt där det förekommer ett månadsbrev som pdf. Äldre månadsbrev ska gå att hämta om man klickar in sig på en sida under i hierarkin.

Sidan med aktuellt månadsbrev är snyggt designad men sidan med de äldre breven skulle kunna vara en enkel lista med filer bara.

Det smartaste vore en sida som skapades dynamiskt. En dynamisk funktion som läser vilka filer som ligger i en viss mapp och listar dom automatiskt när man tittar på den sidan.

Vad behöver åstadkommas för att få den funktionen?

  • Medlem
  • International user
  • 2006-07-04 14:58

Själv har jag använt mig utav php-scriptet Autoindex:http://autoindex.sourceforge.net/

Tycker att det funkar mycket bra.

Det där verkar lovande.

Det finns två varianter - en för php4 och en för php5. Sajten jag producerar ligger på Levonline. Jag sökte på deras supportsida och vad jag kan få fram där så har de bara stöd för php4. Någon som vet om det stämmer?

  • Medlem
  • Vallentuna
  • 2006-07-04 18:19
Ursprungligen av Anders Täpp:

Det där verkar lovande.

Det finns två varianter - en för php4 och en för php5. Sajten jag producerar ligger på Levonline. Jag sökte på deras supportsida och vad jag kan få fram där så har de bara stöd för php4. Någon som vet om det stämmer?

Verkar stämma: http://levonline.com/phpinfo.php

  • Medlem
  • Lund
  • 2006-07-04 18:36

Kollade på deras phpinfo.php, OpenSSL 0.9.7a från 2003, känns inte så säkert när den stabila versionen som finns nu är 0.9.7j (eller nåt sånt).

Ok nu har jag testat ut lite inställningar som passar mig. Här är några frågor:

1. Sidan innehåller texten "Innehåll ./" längst upp till vänster. Kan jag radera den texten i index.php nånstans? Eller sätta samma färg som bakgrunden så den göms?

2. Jag skulle vilja visa den här sidan inuti en annan sida där jag har min sajts meny etc. Hur kan man åstadkomma detta?

  • Medlem
  • Vallentuna
  • 2006-07-04 21:00

PHP-koden för en väldigt enkel lista som visar alla filer i en katalog i en lista, med länk till varje fil, kan vara nåt enkelt i stil med detta:

<h1>Min lista</h1>

<ul>

<?php

$dir = '/home/dinsajt/public_html/pdf';
$url = 'http://www.dinsajt.com/pdf';

// Visa inte dessa filer i listan
$ignore_files = array('.', '..');

$dir = opendir($dir);

while (false !== ($item = readdir($dir))) { // För varje objekt i katalogen 

	// Ignorera systemfiler och dolda filer
	if (in_array($item, $ignore_files) || $item{0} == '.') continue;
   
	echo '<li><a href="'.$url.'/'.rawurlencode($item).'">'.$item.'</a></li>';
  
}
?>

</ul>

Detta är nog enklare att anpassa efter dina önskemål än det färdiga scriptet som verkar göra en hel del annat också.

Man kan som du ser blanda PHP-kod med HTML, för att få det enhetligt med sajten i övrigt.

Filens namn behöver normalt sluta på .php för att PHP-koden ska tolkas av webbservern.

Ursprungligen av malesca:

PHP-koden för en väldigt enkel...

Detta satt som en smäck. Tusen tack.

Är det mycket jobb att få med uppgift om filens storlek. Jag tror inte de behöver ha med detta men ifall frågan kommer upp.

  • Medlem
  • Vallentuna
  • 2006-07-12 21:34
Ursprungligen av Anders Täpp:

Detta satt som en smäck. Tusen tack.

Är det mycket jobb att få med uppgift om filens storlek. Jag tror inte de behöver ha med detta men ifall frågan kommer upp.

Detta:

Citat:

$size = human_format_size(filesize($dir.'/'.$item));
echo '<li><a href="'.$url.'/'.rawurlencode($item).'">'.$item.'</a> ('.$size.')</li>';

och så definitionen av human_format_size() lite var som helst, t.ex. efter de första $dir- och $url-raderna överst:

Citat:

function human_format_size($bytes) {
$formats = array("%d B", "%.1f KB", "%.1f MB", "%.1f GB", "%.1f TB");
$logsize = min((int)(log($bytes)/log(1024)), count($formats)-1);
$size = sprintf($formats[$logsize], $bytes/pow(1024, $logsize));
$size = str_replace('.', ',', $size);
return $size;
}

Ta bort str_replace-raden om du inte vill ha decimalkomma.

För ytterligare utökningar är PHP-manualen väldigt bra (tror jag fick human_format_size därifrån).

Tack för tipset. Jag får kolla närmare på de här prylarna lite närmare när värmeböljan dragit förbi...

Det ville dock inte funka.

Jag gjorde en kopia på filen som funkar och klistrade in de nya raderna men får följande felmeddelande på varje fil i listan.

Warning: filesize(): Stat failed for Resource id #2/Test2.pdf (errno=2 - No such file or directory) in /home/ (lång adress) /brev/brev-arkiv2.php on line 251

  • Medlem
  • Vallentuna
  • 2006-07-13 07:28
Ursprungligen av Anders Täpp:

Det ville dock inte funka.

Jag gjorde en kopia på filen som funkar och klistrade in de nya raderna men får följande felmeddelande på varje fil i listan.

Warning: filesize(): Stat failed for Resource id #2/Test2.pdf (errno=2 - No such file or directory) in /home/ (lång adress) /brev/brev-arkiv2.php on line 251

Oj, hoppsan. Vi använder $dir/$item för att representera det kvalificerade (inklusive katalognamn) filnamnet när vi ska få ut storleken, men jag tänkte inte på att vi ju ändrade $dir att inte längre vara en textsträng med katalognamnet, utan i stället nån mer abstrakt katalogreferens.

Om man ändrar

$dir = opendir($dir);

till typ

$dir_handle = opendir($dir);

och sen

readdir($dir)

till

readdir($dir_handle)

så borde det gå bättre. Då fortsätter $dir att vara katalognamnet bara.

Nu funkar det igen!

Jag skulle vilja peta in 2 st mellanslag [  ] före parentesen med storleksinfo. Var lägger jag in det?

  • Medlem
  • Vallentuna
  • 2006-07-13 17:38

När man kodar webbsidor i PHP kan man så att säga gå ut ur HTML in i PHP, eller ut ur PHP in i HTML, lite när man vill. Byt ut

echo '<li><a href="'.$url.'/'.rawurlencode($item).'">'.$item.'</a> ('.$size.')</li>';

mot

?>

<li><a href="<?php echo $url; ?>/<?php echo rawurlencode($item); ?>"><?php echo $item; ?></a> (<?php echo $size; ?>)</li>

<?

så blir det nog tydligare vad som behöver göras. Allt mellan <?php och ?> är PHP-kod som körs och ger nåt resultat (typ filnamnet eller filens storlek), medan allt som är utanför <?php ?>-sjoken är helt vanlig HTML. Dina mellanslagstecken kan alltså stoppas just före parentesen. Detta hade förresten gått lika bra utan ändringen ovan, men det här andra sättet att skriva koden är nog lättare för dig att ändra i.

Man kan förresten ofta skriva t.ex. <?=$url?> som kortform för <?php echo $url; ?>. Det är kortare och mer läsbart men är inte garanterat att funka på alla webbhotell.

Som en parentes finns det snyggare sätt att få till större mellanrum än att använda flera  , nämligen CSS, men om du inte känner till det redan är det överkurs. Kan dock kanske vara intressant att titta på.

CSS är jag bekant med men nu nöjde jag mig med att bara peta in mellanslagen i den befintliga koden. Tack än en gång.

Jag ändrade förresten formatet KB till kB vilket är korrekt IEC Standard för kilobyte.

Sajten använder sig av Contribute. När detta nu aktiverades så sparade Contribute ett par osynliga mappar överallt (_notes, _baks). Jag tror inte jag kan stänga av detta. Det skulle räcka att scriptet inte listar underliggande mappar för att lösa problemet. Eller sorterade bort mappar som börjar med understreck eller punkt (jag hade även lyckats få med en .DS_Store tidigare).

  • Medlem
  • Vallentuna
  • 2006-08-09 14:41

Borde funka om du ändrar

if (in_array($item, $ignore_files) || $item{0} == '.') continue;

till typ

if (preg_match(/^[._]/, $item)) continue;

. Möjligen behöver man skriva \. i stället för bara punkten - testa det om den inte visar några filer.

Som vanligt finns det mer att läsa i PHPs eminenta manual på php.net.

Oavsett hur punkten skrivs får jag
Parse error: syntax error, unexpected '/', expecting ')' in /home/..... protokoll2.php on line 266

Jag gjorde ett försök med manualen men när man inte ens lyckas söka fram området man är intresserad av får man inse att man är besegrad...

Vad gör den här delen?
// Visa inte dessa filer i listan
$ignore_files = array('.', '..');

  • Medlem
  • Vallentuna
  • 2006-08-09 17:59

Manualen är så trevligt upplagd att man kan skriva t.ex. http://php.net/preg_match för information om den funktionen.

Ah, släng citationstecken runt "/^[._]/" så funkar det fint. Har inte skrivit PHP på ett tag; hade glömt den begränsningen.

Den delen behövs inte om du gör min ändring. Det den gjorde var att skapa en lista över vilka filer som inte skulle visas, som bestod av "." och "..". De betyder nämligen "den här katalogen" och "överstående katalog" och skulle annars visas.

Den nya lösningen (att inte visa sådant - filnamn eller kataloger - som börjar med . eller _) täcker ju in det fallet.

Yes kanon, där satt den!

Tänk vad två fnuttar kan förändra ens liv i dagens samhälle...

Något mycket konstigt har uppstått. Skärmklippet i inlägg 18 visar att filerna listar sig i rätt bokstavsordning (datumordning). Idag får jag mail av kunden som säger att filerna ligger huller om buller. Jag kan bara konstatera att så är fallet men jag har inte ändrat något i koden sen sidan slutfördes.

1
Bevaka tråden