Avatar billede jiv Nybegynder
09. maj 2011 - 23:15 Der er 6 kommentarer og
1 løsning

PHP script for download

Hej.

Jeg har en hjemmeside som er delt i en højre og venstre frame.
I venstre side har jeg 10 forskellige ord som definere deres biblioteker. Meningen er så at når man trykker på et af mapperne i venstre side skal indholdet komme frem i højre frame.
Filerne er af alle mulige slags.
Herefter skal det være muligt at downloade den fil man trykker på i højre frame.

Scriptet skal laves i PHP da det, så vidt jeg ved, er det eneste som min udbyder tilbyder.

Hvis der er en der forbarmer sig over mig, må jeg hellere lige sige, at jeg intet kender til php så derfor har jeg brug for god
forklaring til hvor, hvad jeg skal indsætte når vi kommer til det med at indsætte host navn og path.

M.v.h.
JIV
Avatar billede kjeldsted Novice
09. maj 2011 - 23:47 #1
Hm. Hvis jeg forstår dig ret, lyder det til at du nærmere skal have fat i JavaScript end PHP.
Avatar billede danco Nybegynder
10. maj 2011 - 23:09 #2
<?php
//Angiver mappen hvori alle dokumenter er placeret
$path='download';

// Alle filer i mappen hentes til et array
chdir($path);
$files=glob('*.*');

// Opretter et array af mime typer for at kunne sende filen til download senere i koden
$mime_types=array();
$mime_types['ai']    ='application/postscript';
$mime_types['asx']  ='video/x-ms-asf';
$mime_types['au']    ='audio/basic';
$mime_types['avi']  ='video/x-msvideo';
$mime_types['bmp']  ='image/bmp';
$mime_types['css']  ='text/css';
$mime_types['doc']  ='application/msword';
$mime_types['eps']  ='application/postscript';
$mime_types['exe']  ='application/octet-stream';
$mime_types['gif']  ='image/gif';
$mime_types['htm']  ='text/html';
$mime_types['html']  ='text/html';
$mime_types['ico']  ='image/x-icon';
$mime_types['jpe']  ='image/jpeg';
$mime_types['jpeg']  ='image/jpeg';
$mime_types['jpg']  ='image/jpeg';
$mime_types['js']    ='application/x-javascript';
$mime_types['mid']  ='audio/mid';
$mime_types['mov']  ='video/quicktime';
$mime_types['mp3']  ='audio/mpeg';
$mime_types['mpeg']  ='video/mpeg';
$mime_types['mpg']  ='video/mpeg';
$mime_types['pdf']  ='application/pdf';
$mime_types['pps']  ='application/vnd.ms-powerpoint';
$mime_types['ppt']  ='application/vnd.ms-powerpoint';
$mime_types['ps']    ='application/postscript';
$mime_types['pub']  ='application/x-mspublisher';
$mime_types['qt']    ='video/quicktime';
$mime_types['rtf']  ='application/rtf';
$mime_types['svg']  ='image/svg+xml';
$mime_types['swf']  ='application/x-shockwave-flash';
$mime_types['tif']  ='image/tiff';
$mime_types['tiff']  ='image/tiff';
$mime_types['txt']  ='text/plain';
$mime_types['wav']  ='audio/x-wav';
$mime_types['wmf']  ='application/x-msmetafile';
$mime_types['xls']  ='application/vnd.ms-excel';
$mime_types['zip']  ='application/zip';

// Findes der et filnavn i GETTER informationen?
if(!$_GET['file']){
  // Hvis ikke, smid en besked til brugeren
  $error='No file specified to download';
}elseif(!in_array($_GET['file'],$files)){
  // hvis filen ikke m? downloades, smid en besked
  $error='Requested file is not available';
}else{
  // Henter filnavn og filtype
  $file=$_GET['file'];
  $ext=strtolower(substr(strrchr($file,'.'),1));
}
// Er vores filtype af mime arrayet
if($ext && array_key_exists($ext,$mime_types)){
  // Hvis det er s? henter vi mime typen
  $mime=$mime_types[$ext];
}else{
  // Ellers, smid en besked til brugeren
  $error=$error?$error:"Invalid MIME type";
}

// Hvis vi ikke fik nogen fejlmeddelser
if(!$error){
  // Eksisterer filen?
  if(file_exists("$file")){
      // Kan filen l?ses?
      if(is_readable("$file")){
        // Fil st?rrelse
        $size=filesize("$file");
        // L?s filen
        if($fp=@fopen("$file",'r')){
            // send headere
            header("Content-type: $mime");
            header("Content-Length: $size");
            header("Content-Disposition: attachment; filename=\"$file\"");
            // send filens indhold
            fpassthru($fp);
            // Luk filen
            fclose($fp);
            // og stop
            exit;
        }
      }else{ // Filen kan ikke læses
        $error='Cannot read file';
      }
  }else{  // Filen eksisterer ikke
      $error='File not found';
  }
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
<title>Download</title>
</head>
<body>
<h1>Download Failed</h1>
<?php
  if($error) print "<p>The error message is: $error</p>\n";
?>
</body>
</html>


Ovenstående er et script jeg selv har brugt engang. Jeg har dog renset det lidt op fra mine egne ønsker.
Hvad du skal nu er blot at overveje hvordan du vil fortælle scriptet hvilken fil der skal downloades. Her kan du, som jeg ser det, med fordel vælge at gøre brug af GET parametre sådan du opbygger dine links til følgende:

download.php?path=images/thumbs/apple.jpg

min tanke er så at scriptet direkte skal smide apple.jpg til download for din browser.

Du skal lige være opmærksom på at det vil kræve at du bruge din GET parameter i typen af scriptet
Avatar billede jiv Nybegynder
11. maj 2011 - 23:23 #3
Hej.

Jeg får nok først tid i weekenden til at afprøve din php script.

Men inden da har jeg lige et par spørsmål.

Hvis filen nu ikke er en af de angivne i scriptet, hvad sker der så. Kunne man ikke blot tillade alt, bortset fra .bat, .exe og .com filer.

Så er der det med:
Citat: "Hvad du skal nu er blot at overveje hvordan du vil fortælle scriptet hvilken fil der skal downloades."

Jeg går ud fra at scriptet viser hele mappens indhold i højre frame, hvis jeg blot peger på at scriptet skal køres i denne frame.
Dernæst skal man blot "trykke" på den fil man vil hente fra mappen ned til sin egen computer og DL starter.

Det er ikke meningen at der skal laves link på siden til hver fil der findes i mappen. Filerne bliver nemmelig udskiftet og nye kommer til, meget ofte.

Er der hvor der står og nedefter også en del af PHP scriptet ?
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"

I starten angives følgende:
//Angiver mappen hvori alle dokumenter er placeret
$path='download';

Hvis nu mappen, hvor filerne ligger i, er placeret på serveren... hjem\have\planter    skal ovenstående linie angives således ?

//Angiver mappen hvori alle dokumenter er placeret
$path='planter';
Hvis blot jeg sørger for at scriptet ligger i mappen "planter" ?

Jeg har naturligvis set nogle forskellige muligheder på nettet for en løsning og de fleste har indeholdt en linie hvor der skulle indsættes "Host-navn" "Brugernavn" "Adgangskode" men det skal der ikke til denne ?

Jeg har en script til Login til 1.side
Den anvender en SQL database på serveren, som indeholder brugernavn og adg.kode til Login.
Har det nogen betydning for dl fra mapperne ? 

En ting mere er det der med GET parameter.
Jeg har ikke meget forstand på PHP scritp, eller for den sags skyld andre former for script, så jeg er på bar bund når du skriver dette.

Okay, det var en ordentlig omgang, men jeg ved også, at jeg ikke kommer meget længere, hvis jeg skal igang med testen og der så forventes nogle tilretninger fra min side..  :-)

Med venlig hilsen
jiv
Avatar billede danco Nybegynder
12. maj 2011 - 12:02 #4
Det er vigtigt at understrege at scriptet i sig selv ikke præsentere data for brugeren. Det skal du bruge et andet script til. Hvad dette script derimod gør er at det sender filen fra din server til brugerens browser som herefter vil stå for download af filen.

Du skal ikke bruge Host, Password eller noget som helst andet. Den eneste grund til at bruge det er hvis du tilgår serveren via FTP, og det gør du ikke med denne metode.

GET parametre:
dette er en type af parametre som man parse til sit script gennem URL'en. Dvs altså sige at i stedet for URL hedder:
download.php

så kan man parse nogle flere imformationer med over til scriptet. Det kunne være mange forskellige ting, men i dit tilfælde ville det give mest mening at du har 2 paramatre, folder og fil. Din URL vil altså komme til at se sådan herud:
download.php?folder=planter&file=blomster.pdf

$path skal erstattes af den relative sti til mappen dvs:

$path = 'hjem/have/planter';

Nu vil du formentlig opdage at planter går igen 2 steder både i path og som GET parameter, derfor kan du erstatte ovenstående eksempel med:

$path = 'hjem/have/'.$_GET['folder'];

På den måde opnår du en dynamisk løsning.
Avatar billede jiv Nybegynder
17. maj 2011 - 21:06 #5
Hej Danco

Jeg takker for dit indslag, men den løser ikke rigtig mit problem som jeg lige ser det.

Jeg vil stadig ikke kunne sammenfatte en løsning, da jeg ingen kendskab har til programmering i PHP.

Medmindre nogen kommer med den del som mangler i dit forslag og giver en løsning for sammenkobling mellem de 2 dele.

Mvh.
jiv
Avatar billede danco Nybegynder
18. maj 2011 - 00:57 #6
<?php
if ($handle = opendir('.')) {
  while (false !== ($file = readdir($handle)))
      {
          if ($file != "." && $file != "..")
      {
              $list .= '<a href="download.php?file='.$file.'">'.$file.'</a><br>';
          }
      }
  closedir($handle);
  }
  echo $list;
?>

Ovenstående kode viser dig alle de filer der findes i mappen som den findes i og gør brug af ovenstående download script til at smide dem til download.
Avatar billede jiv Nybegynder
19. maj 2011 - 23:57 #7
Hej.

Jeg har nu fået noget stykket noget sammen, som virker som tænkt.
Nu har jeg en PHP kode til upload og en til download.

I får lige koderne her.
Håber nogen måske også kan anvende den.

Mvh.
jiv



Download af fil fra web server til egen computer PHP koden.
For at downloade en fil skal der højre-klikkes på filen og vælges "Gem fil" man kan altså ikke bare trykke på den, for så vil filen forsøge at starte.
-------------------------------------------------------------
<body bgcolor="#DFD2B3"> // Dette er blot for at få lidt farve på siden.
<?php


$dir = "2000"; // Biblioteket som jeg downloade fra

$directories = array();
$files = array();
$dir = (substr($dir, -1) == '/') ? substr($dir, 0, -1) : $dir;
if(is_dir($dir)){
    if($handle = opendir($dir)){
        while(false !== ($file = readdir($handle))){
            if($file != "." && $file != ".."){
                if(is_dir($dir.'/'.$file)){
                    $directories[$file] = filemtime($dir.'/'.$file);
                } else {
                    $files[$file] = filemtime($dir.'/'.$file);
                }
            }
        }
        closedir($handle);
    } else {
        die('Could not open directory.');
    }
} else {
    die('Invalid directory.');
}

if($_GET['sort'] == 'alpha'){
    if($_GET['mode'] == 'desc'){
        krsort($files);
        $highlight = 'alpha_desc';
    } else {
        ksort($files);
        $highlight = 'alpha_asc';
    }
} else {
    if($_GET['mode'] == 'asc'){
        asort($files, SORT_NUMERIC);
        $highlight = 'date_asc';
    } else {
        arsort($files, SORT_NUMERIC);
        $highlight = 'date_desc';
    }
}
$sort_alpha_asc = ($highlight == 'alpha_asc') ? '<b>Asc</b>' : '<a href="?sort=alpha&mode=asc">Asc</a>';
$sort_alpha_desc = ($highlight == 'alpha_desc') ? '<b>Desc</b>' : '<a href="?sort=alpha&mode=desc">Desc</a>';
$sort_date_asc = ($highlight == 'date_asc') ? '<b>Asc</b>' : '<a href="?sort=date&mode=asc">Asc</a>';
$sort_date_desc = ($highlight == 'date_desc') ? '<b>Desc</b>' : '<a href="?sort=date&mode=desc">Desc</a>';
echo "Sort by: Date- $sort_date_asc | $sort_date_desc; Name- $sort_alpha_asc | $sort_alpha_desc<br />\n<br />\n";

echo "<table border=\"0\">\n<tr><td><u>File</u></td><td width=\"25\"></td><td><u>Size</u></td><td width=\"25\"></td><td><u>Last Modified</u></td></tr>\n";
foreach($files as $file => $timestamp){
    echo "<tr><td><a href=\"$dir/$file\">$file</a></td><td></td><td>";
    $filesize = filesize($dir.'/'.$file);
    if($filesize >= 1048576){
        echo round($filesize / 1048576, 1).'MB';
    } else {
        echo round($filesize / 1024, 1).'kb';
    }
    echo '</td><td></td><td>'.date('M d Y H:i:s', $timestamp)."</td></tr>\n";
}
echo '</table>';

?>



-------------------------------------------------------------
I får lige koden her. Upload af fil fil web server PHP koden.

Det er lavet i PHP og filen skal gemmes som "Upload2000.php" da den bliver kaldt igen nede i bunden af scriptet i //Vores form
Den kan naturligvis hedde noget andet, bare man så ændre navnet nede i bunden, hvor den kaldes igen.
------------------------------------------


<body bgcolor="#DFD2B3">

<?php
$uploadDir = '2000/'; //Bibliotek hvor filer uploades til - husk chmod 777 på de mapper der skal uploades til på serveren.
$allowedFileTypes = array('jpg','gif','png','doc','txt'); //Hvilke filer vil jeg acceptere bliver uploadet?

//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
  //Har vi en fil?
  if(is_uploaded_file($_FILES['myFile']['tmp_name']))
  {
    //Filendelse
    $extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));
   
    //Er filen en af de filer vi gerne vil have?
    if(in_array($extension,$allowedFileTypes))
    {
      //Vi flytter filen fra tmp til vores UPLOADDIR
      if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
      {
        echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully</h3>';
      }
      else
      {
        echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
      }
    }
    else
    {
      echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
    }
  }
  else
  {
    echo '<h3 style="color:red;">Du mangler vist at vælge en fil til upload !</h3>';
  }
}

//Vores form
echo '<form action="upload2000.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';

?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester