Avatar billede dotcom1 Nybegynder
05. april 2005 - 13:15 Der er 6 kommentarer og
1 løsning

Force download-script kan ikke deeplinke i IE

Jeg bruger nedenstående force download og kliktæller script. Det fungerer udmærket, men i IE kan jeg ikke linke direkte til mine pdf-dokumenter, f.eks. fra en Google-søgning. Eller jo, jeg kan godt linke til dokumenterne, men de kan ikke downloades. I IE fejlmeldes det at dokumentet ikke kan indlæses. Det virker dog fint når pdf-dokumentet hentes fra min egen download-side. Kan man ændre i nedenstående script, så der også kan deeplinkes i IE? I Firefox virker det på begge måder - åbn/gem-dialogen kommer fint frem.

<?php
### Force download og klik-tæller-script.
### Create MySQL table query
/*
CREATE TABLE `downloads` (
`ID` tinyint(4) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '0',
`downloads` tinyint(4) NOT NULL default '0',
`date` datetime NOT NULL,
PRIMARY KEY (`ID`),
KEY `ID_2` (`ID`)
) TYPE=MyISAM;
*/
### Konfigurerbare variabler.
$sql = false;
$conf['host'] = 'localhost';
$conf['base'] = '*****';
$conf['login'] = '*****';
$conf['password'] = '*****';
// Path of the files;
$path = "opgaver/";

function download($path,$file){
$length = filesize("$path/$file");
header("Content-Type: application/force-download; name=\"$file\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $length");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("$path/$file");
}

function err_msg($text) {
    $out = '<center>'."\n";
    $out .= '<br><br><br>'."\n";
    $out .= '<font face="Arial, Helvetica" color="#D20000" size="2"><b>'.$text.'</b></font>'."\n";
    $out .= '</center>';
    die($out);
}

$file = ( isset($_GET['file']) && $_GET['file']!='' ) ? $_GET['file'] : null;
$request = "select * FROM downloads WHERE name LIKE '$file'";

$date = date("Y-m-d H:i");

### Is the file already in the db ?
$db = mysql_connect($conf['host'], $conf['login'], $conf['password']);
mysql_select_db($conf['base'],$db);
$req = mysql_query($request);

$in_db = @mysql_num_rows($req);

if($file){
    if(!is_file($path.$file)){
        err_msg('Fil ikke tilgængelig!');
    }
    ### The file has not been downloaded yet
    if(!$in_db){
        $sql = "INSERT INTO downloads (ID, name, downloads, date) Values ('', '$file', '1', '$date')";
    ### Already downloaded
    }
    else {
    $sql = "UPDATE downloads SET downloads = downloads+1 WHERE name='$file'";
    }
}
else{
    $res = mysql_query("SELECT ID, name, downloads FROM downloads");
    while ($row = mysql_fetch_assoc($res)) {
        $ids[] = $row['ID'];
        $link_info[$row['ID']]['name'] = $row['name'];
        $link_info[$row['ID']]['downloads'] = $row['downloads'];
//        echo info[$row['id']]['downloads']." ".info[$row['id']]['name']."<br>";
    }
}

if($sql){
    $db = mysql_connect($conf['host'], $conf['login'], $conf['password']);
    mysql_select_db($conf['base'],$db);
    $result = mysql_query($sql);
   
    ### Send file
    download($path,$file);
}

mysql_close();

function makeDownloadLink($id){
$db = mysql_connect('localhost', '*****', '*****');
mysql_select_db('*****',$db);
$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$db);
$result = mysql_fetch_row($result);
return $result;
}

### get specific link by ID
function getLinkById($ID,$ids,$link_info){
    if(in_array($ID,$ids)){
        // bemærk at det i nogle tilfælde vil være nødvendigt at ændre linkadressen (hardcode link i stedet for $_SERVER['PHP_SELF'])
        echo "<a href=\"".$_SERVER['PHP_SELF']."?file=".$link_info[$ID]['name']."\">".$link_info[$ID]['name']."</a> - Downloadet ".$link_info[$ID]['downloads'];
        echo $link_info[$ID]['downloads'] == 1 ? " gang" : " gange";
        echo "<br />\n";
    }
    else
        echo "Linket findes desværre ikke - fejlmeld venligst til webmaster!";
}
?>

Linket kaldes sådan i en browser: http://www.site.dk/downloads.php?file=dokument.pdf
og sådan i koden: /downloads.php?file=<?php $myLink = makeDownloadLink(13); ?>
Avatar billede alister_crowley Nybegynder
05. april 2005 - 13:19 #1
www.php.net/header

Der står faktisk en eksempel som forcer download af pdf :P
Avatar billede dotcom1 Nybegynder
05. april 2005 - 13:29 #2
Men jeg har allerede et script som forcer downloads. Og det virker fint. Problemet opstår når man linker til det dokument, der skal downloades, direkte fra Internet Explorer, fx. sådan: http://www.site.dk/downloads.php?file=dokument.pdf så vil IE ikke indlæse og åbne dokumentet. Fra min egen download-side virker det fint.
Avatar billede alister_crowley Nybegynder
05. april 2005 - 14:14 #3
prøv med http://dk2.php.net/urlencode , og se om IE så vil downloade det bagefter.
Avatar billede dotcom1 Nybegynder
05. april 2005 - 14:18 #4
Lyder interessant, men hvordan implementerer jeg det i det nuværende script? Er ikke stærk i php.
Avatar billede alister_crowley Nybegynder
05. april 2005 - 14:29 #5
og sådan i koden: /downloads.php?file=<?php $myLink = makeDownloadLink(13); ?>

bliver til

og sådan i koden: /downloads.php?file=<?php echo urlencode($myLink); ?>

:P
Avatar billede dotcom1 Nybegynder
05. april 2005 - 14:36 #6
Hmm, det virker ikke. Det besynderlige er, at dette script, som også er forcedownload og klik-tæller - dog flat-file baseret, virker ved direkte link:

<?php

$download_dir = '.'; // the folder where the files are stored
$counter_dir = 'counters'; // the folder where your counter files are stored

// each file to download must have a file called like "filename + .txt" in the counter folder
// download the file [download.php?get=name_of_file]

$path = $download_dir.'/'.$HTTP_GET_VARS['get'];

if(file_exists($path)){
$file = fopen($counter_dir.'/'.$HTTP_GET_VARS['get'].'.txt','r+');
$count = fread($file,100);
fclose($file); // closes file
$count++;
$file = fopen($counter_dir.'/'.$HTTP_GET_VARS['get'].'.txt','w'); // opens file again with 'w'-parameter
fwrite($file, $count);
fclose($file);

$size = filesize($path);

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$HTTP_GET_VARS['get']);
header('Content-Length: '.$size);

readfile($path); 

}else{

    echo "<font face=$textfont size=2>";
    echo "<center><br><br>The file [<b>$get$extension</b>] is not available for download.<br>";
    echo "Please contact the web administrator.";
}
?>
Viker perfekt i IE ved link: http://www.site.dk/downloads.php?get=dokument.pdf
Hvad er det, der gør forskellen?
Avatar billede dotcom1 Nybegynder
05. april 2005 - 21:46 #7
Fik hjælp andetsteds til en løsning: :-)

<?php

### Force download click counter script.
### Create MySQL table query
/*
CREATE TABLE `downloads` (
`ID` tinyint(4) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '0',
`downloads` tinyint(4) NOT NULL default '0',
`date` datetime NOT NULL,
PRIMARY KEY (`ID`),
KEY `ID_2` (`ID`)
) TYPE=MyISAM;
*/
### config variables.
$sql=false;
$conf=array();
$conf['email'] = 'test@yourmail.dk';
$conf['host'] = 'localhost';
$conf['base'] = '******_';
$conf['login'] = '*****';
$conf['password'] = '*****';
$conf['file_path']='mydownloads';//No Trailing Slash!

### Connect To Database
$db=mysql_connect($conf['host'], $conf['login'], $conf['password']) OR error('MySQL Connect Failed');
mysql_select_db($conf['base'],$db) OR error('MySQL Select DB Failed');

function download($path,$file)
{
    global $conf;
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$file);
    header('Content-Length: '.filesize($path.'/'.$file));
    readfile($path.'/'.$file) OR error('Error Reading File');
}

function error($text)
{
    global $conf;
    $out = '<p align="center" style="font:12pt Arial"><br><br><br><b>'.$text.'</b></p>'."\n";
    mail($conf['email'],'Error Report','Error Report: '.$out,'From: errors@'.$_SERVER['HTTP_HOST']);
    exit($out);
}
/*
function makeDownloadLink($id)
{
    global $db;
    $result=mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$db);
    return mysql_fetch_row($result);
}
*/
function getLinkById($id,$ids,$link_info) //get specific link by ID
{
    if(in_array($id,$ids))
    {
        echo "<a href=\"".$_SERVER['PHP_SELF']."?file=".$link_info[$id]['name']."\">".$link_info[$id]['name']."</a> - Downloadet ".$link_info[$id]['downloads'];
        echo $link_info[$id]['downloads'] == 1 ? " time" : " times";
        echo "<br />\n";
    } else echo "Link does not exist.";
}

$file=(isset($_GET['file']) && $_GET['file']!='') ? $_GET['file'] : null;
$date=date("Y-m-d H:i");


$req=mysql_query("SELECT * FROM `downloads` WHERE name LIKE '$file'",$db) OR error('MySQL Query Failed: '.mysql_error());

if($file)
{
    if(!is_file($conf['file_path'].'/'.$file)) error('File not avaliable!');

    ### The file has not been downloaded yet
    if(mysql_num_rows($req) === 0)
    {
        $sql = "INSERT INTO downloads (ID, name, downloads, date) Values ('', '$file', '1', '$date')";
        ### Already downloaded
    } else
    {
        $sql="UPDATE downloads SET downloads = downloads+1 WHERE name='$file'";
    }
} else
{
    $res=mysql_query("SELECT ID, name, downloads FROM downloads");
    $ids=array();
    while($row = mysql_fetch_assoc($res))
    {
        $ids[]=$row['ID'];
        $link_info[$row['ID']]['name'] = $row['name'];
        $link_info[$row['ID']]['downloads'] = $row['downloads'];
    }
}

if($sql)
{
    $result=mysql_query($sql,$db);
    download($conf['file_path'],$file);
}

mysql_close($db);
?>
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