2017-04-18 131 views
1

我使用这个下载文件的URL变化:PHP文件下载防止

<a href="download_init.php?Down=01.zip">download here</a> 

download_init.php:

<?php 
$Down=$_GET['Down']; 
?> 

<html> 
    <head> 
    <meta http-equiv="refresh" content="0;url=<?php echo $Down; ?>"> 
</head> 
<body> 
</body> 
</html> 

有没有一种方法,以防止浏览器的URL链接,当点击不改变AJAX?

download_init.php?Down=01.zip 

入住这里:http://www.firegrid.co.uk/scripts/download/index.php

点击第一个链接,该URL并没有改变,不像其他的环节上。

+0

提供'download'属性来锚定 –

+0

我认为您可以使用header()函数在download_init中下载文件。 – lalithkumar

+3

这根本不安全;使用标题并将该文件隐藏在根外部以获得更好的安全性。 –

回答

1

添加download属性锚标记:

<a href="download_init.php?Down=01.zip" download>download here</a> 

更多细节上HTML download Attribute

如果你想使用header请参考this link

+0

如果我使用这样的下载,它只是下载download_init.php文件而不是01.zip – Toniq

+0

否.... if您正在使用另一个文件来下载您的zip文件,而不是像下面的@poiz所提到的那样使用正确的标题。如果您想直接使用使用下载属性和锚标记,则必须将zip文件的实际路径链接为href。 –

+0

我的主要问题实际上是否可以使用我的方法来防止URL更改。 – Toniq

1

您可以用屈指可数执行实际的下载header功能如下面的代码所示。

但是;首先,您可能需要在应用程序的根目录下创建一个任意处理文件(例如:download_init.php)。现在download_init.php文件里面,你可以添加这样的事情:

<?php 

// CHECK THAT THE `d` PARAMETER IS SET IN THE GET SUPER-GLOBAL: 
// THIS PARAMETER HOLDS THE PATH TO THE DOWNLOAD-FILE... 
// IF IT IS SET, PROCESS THE DOWNLOAD AND EXIT... 
if(isset($_GET['d']) && $_GET['d']){ 
    processDownload($_GET['d']); 
    exit; 
} 

function processDownload($pathToDownloadFile, $newName=null) { 
    $type    = pathinfo($pathToDownloadFile, 
            PATHINFO_EXTENSION); 
    if($pathToDownloadFile){ 
     if(file_exists($pathToDownloadFile)){ 
      $size  = @filesize($pathToDownloadFile); 
      $newName = ($newName) ? $newName . ".{$type}" :basename($pathToDownloadFile); 
      header('Content-Description: File Transfer'); 
      header('Content-Type: ' . mime_content_type ($pathToDownloadFile)); 
      header('Content-Disposition: attachment; filename=' . $newName); 
      header('Content-Transfer-Encoding: binary'); 
      header('Connection: Keep-Alive'); 
      header('Expires: 0'); 
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
      header('Pragma: public'); 
      header('Content-Length: ' . $size); 
      return(readfile($pathToDownloadFile)); 
     } 
    } 
    return FALSE; 
} 

然而,这意味着你的链接现在会略有不同href值,就像这样:

<!-- THIS WOULD TRIGGER THE DOWNLOAD ONCE CLICKED --> 
<a href="download_init.php?d=path_to_01.zip">download here</a> 

如果你觉得这个标题的方法对于你的目的来说太无关紧要; @Sanchit Gupta提供了一个HTML5 download属性的解决方案....