只允许特定用户从服务器上下载文件

问题描述:

我正在基于用户数据创建文件(从数据库表中读取数据,写入csv文件,存储在服务器上,然后打印出用户的链接(登录)下载)。只允许特定用户从服务器上下载文件

如何确保只有用户可以下载该文件?例如,如果文件存储在http://mysite.com/username/file,我怎样才能确保只有该用户在登录时才是唯一可以下载文件的用户?使用PHP。

感谢您的帮助

PHP手册有一个用户提交的条目已经做了你在找什么:

function query_to_csv($db_conn, $query, $filename, $attachment = false, $headers = true) { 

    if($attachment) { 
     // send response headers to the browser 
     header('Content-Type: text/csv'); 
     header('Content-Disposition: attachment;filename='.$filename); 
     $fp = fopen('php://output', 'w'); 
    } else { 
     $fp = fopen($filename, 'w'); 
    } 

    $result = mysql_query($query, $db_conn) or die(mysql_error($db_conn)); 

    if($headers) { 
     // output header row (if at least one row exists) 
     $row = mysql_fetch_assoc($result); 
     if($row) { 
      fputcsv($fp, array_keys($row)); 
      // reset pointer back to beginning 
      mysql_data_seek($result, 0); 
     } 
    } 

    while($row = mysql_fetch_assoc($result)) { 
     fputcsv($fp, $row); 
    } 

    fclose($fp); 
} 

// Using the function 
$sql = "SELECT * FROM table"; 
// $db_conn should be a valid db handle 

// output as an attachment 
query_to_csv($db_conn, $sql, "test.csv", true); 

// output to file system 
query_to_csv($db_conn, $sql, "test.csv", false); 

我正要编辑您的问题,并删除SQL和CSV标签,因为,作为问,它并没有真正与这些题目做。但是,我的答案是。

而不是将文件保存到文件系统,只需生成csv文件直接输出到响应。您的代码只会为用户生成正确的csv(或者不为非用户提供内容),从而解决问题。

这假定文件的生成适度轻量级,并且不会非常频繁地完成。

+0

感谢您的答复。但是,我并不熟悉如何生成用户可以下载为csv文件的输出。你能给我一个小费吗? – Andrew

+0

将csv输出到文件中后,您可以在设置内容类型标题后将其输出到响应中。 –

如果用户未登录,或者用户名错误,只显示消息或重定向或您想要的任何内容,而不是授予对文件的访问权限。你所展示的url例子应该只是一个带有链接或重定向到真实文件的页面。你甚至可以生成一个文件名哈希值来提高安全性。

不幸的是,你需要在一些代码中包装下载。您可以使用类似的技术:

if ($user->is_correct_user_with_access()) 
{ 
    header('Content-Type: application/octet-stream'); // this can be replaced with whatever file format you want; 

    echo file_get_contents($local_path_to_file); 
    die; 
} 

还要确保您正在生成的文件不在可公开访问的路径(即,它应该是你的文档根目录下)

你可以创建一个名为download.php文件,例如:

if($logged_in && $username == $_GET['download_username']) { 

    header("Content-Type: application/force-download"); 
    header('Content-Disposition: attachment; filename=nameofdownload.zip'); 
    readfile('downloads/' . $_GET['download_username'] . '/file.zip'); 

} 

然后在downloads文件夹,你可以创建一个.htaccess文件,并把以下内容:

Deny from all 

听起来像一个微不足道的问题......有多种方式,如果用户登录,然后只是检查他们请求的文件属于他们。

这样做的最好方法可能是使用传递文件。例如,对/username/file的请求实际上会调用/download.php?id=username&dl=file,然后您可以检查登录的用户是否等于id或试图从中下载的文件的用户名,如果匹配,则使用php标头位置将请求重定向到尽管可以通过查看标题来利用另一个位置;所以为了使它看起来没什么问题,你可以将文件存储在web目录之外,并使用php读取文件并将其直接输出到浏览器。