使用php上传文件 - 显示文件列表

时间:2009-04-20 03:18:59

标签: php

我正在制作一个脚本来通过php上传文件。我想知道的是,如何显示已上传的文件,点击它们打开它们进行下载。我应该将名称和路径存储在数据库中,还是仅使用php列出目录的分数?

4 个答案:

答案 0 :(得分:3)

结帐handling file uploads in PHP。几点:

  • 理想情况下,您希望允许用户同时上传多个文件。只需使用Javascript动态创建额外的文件输入;
  • 当您上传时,请务必检查它是否为is_uploaded_file;
  • 的上传内容
  • 使用move_uploaded_file()将文件复制到您要存储的位置;
  • 不要依赖客户端告诉您MIME类型的内容;
  • 使用PHP脚本可以轻松地将它们发送回客户端,但您需要知道正确的MIME类型;
  • 尝试并验证您所获得的是您所期望的(例如,如果它是PDF文件使用库来验证它是什么),特别是如果您将该文件用于任何内容或将其发送给其他任何人;和
  • 我建议您从客户端的计算机上存储文件的文件名,并将其显示给他们,无论您将其存储为什么。用户更有可能认识到这一点。

答案 1 :(得分:1)

在数据库中存储路径可能没问题,具体取决于您的特定应用程序,但考虑将文件名存储在数据库中,并在一个位置构建PHP中这些文件的路径。这样,如果您以后最终移动所有上传的文件,则代码中只需要一个位置来更改路径生成,并且可以避免在数据库中的“路径”字段上进行大量数据转换。

例如,对于文件1234.txt,您可以将其存储在:

/your_web_directory/uploaded_files/1/2/3/1234.txt

您可以使用配置文件,或者如果您愿意,可以使用全局某个地方来定义上传的存储路径(/您的网络目录/上传文件/),然后将文件名(在数据库中)中的字符拆分为数字该文件实际驻留在哪个子目录中。

至于显示文件,您可以简单地从数据库加载文件列表,并使用路径生成函数根据文件名获取每个文件的下载路径。如果要对文件列表进行分页,请尝试使用START 0,LIMIT 50等内容;在mySQL中。只需在每个连续的上传结果页面中传入一个新的起始编号。

答案 2 :(得分:0)

从这个意义上说,也许你应该使用文件:

myfile.txt

My Uploaded File||my_upload_dir/my_uploaded_file.pdf
Other Uploaded File||my_upload_dir/other_uploaded.html

并像这样经历他们:

<?php
    $file = "myfile.txt";
    $lines = file($file);
    $files = array();
    for($i=0;$i<=count($lines)-1;$i++) {
        $parts = explode($lines[$i]);
        $name = parts[0];
        $filename = parts[1];
        $files[$i][0] = $name;
        $files[$i][1] = $filename;
    }
    print_r($files);
?>
希望这会有所帮助。 :)

答案 3 :(得分:-1)

我一直做的事(过去时,我还没有写过多年的上传脚本)是,我将上传脚本(任何上传脚本)链接到一个简单的数据库。

这提供了一些优点;

  • 您没有为您的用户提供对文件系统的直接了解(如果您的'浏览'脚本中存在泄漏并且您暴露了整个硬盘,该怎么办?
  • 您可以轻松有效地存储额外信息和元数据
  • 您实际上可以查询文件/元数据,而不只是循环遍历所有文件
  • 您可以启用“安全删除”,删除行,但保留文件(例如)
  • 您可以更轻松地启用日志记录方式
  • 在页面中显示文件更容易
  • 您可以'屏蔽'文件。使用数据库可以存储“蒙面”文件名和“真实”文件名。
  • 显然,也有一些缺点;

  • 迁移有点困难,因为您的文件系统和数据库必须同步
  • 如果操作失败(在两端之一上),您有“损坏的”数据库或文件系统
  • 如前所述(但我们不能提,我害怕); _保持上传安全!_

    MIME类型/扩展问题是一个持续很长时间的问题。我认为现在大多数网络都是可靠的,但过去曾经有一段时间开发人员会检查MIME类型或扩展名,但绝不会同时检查两者(为什么要这么麻烦? )。这导致网站非常非常漏洞。

    如果写得不正确,上传脚本是您安全的重大漏洞。一个很好的例子就是我在一段时间内“攻击”的网站(当然是根据他们的要求)。他们支持将图像上传到photoalbum,但他们只检查了文件扩展名。所以我上传了一个GIF,里面有一个目录扫描器。这使我能够扫描整个系统(因为它不是专用服务器;我可以看到更多)。

    希望我帮忙;)