在webserver上存储图像的方法

时间:2013-11-14 20:31:50

标签: php file

我想以安全的方式存储用户上传的图像(.jpg)。我很困惑哪种方式可以获得更好的结果和性能。我能看到的最佳选择是:

1. Store the images in database. 
//problem : database size get large. lagging performance 

2. Store them in a folder in encrypted manner. 
//problem : Encryption and decryption on large file slows it down.

3. Place the image as it is in a folder behind 'public_html' in root directory. 
//problem : I am unsure as they aren't encrypted.

哪种方式更好或是否还有其他“最佳实践”我现在还不知道?

4 个答案:

答案 0 :(得分:2)

不要将它们存储在数据库中。将它们放在上传等网络目录中,并使用.htaccess

保护它们
deny from all

这将限制对它们的访问。

您还应该注意文件名以避免文件命名冲突。

答案 1 :(得分:2)

这是你想用它做什么的问题,以及你希望如何保护它

我没有通过图像看到任何可能的攻击媒介。所以我看到两种可能的选择,但首先是基础知识:

您可以将图像存储在文件系统中。在关系数据库中存储文件效率非常低。

  • 您保留文件本身并将其重命名为内容的 MD5或SHA1哈希
  • 创建数据库条目链接到文件系统上文件的位置,以及您可能需要的任何元数据(所有者,颜色,类别等)。
  • 根据哈希的第一个字母将文件分成多个文件夹(如果您有批次图像,请考虑将其分为基于两个或三个字母的目录。

现在,根据您的访问方案,您可以公开放置文件,只需链接到它们(因为文件名很复杂,猜测它很难),或者您可以将文件放在公共根目录之外,并且一个PHP文件访问它们并在验证权限后为它们提供服务。

答案 2 :(得分:1)

将您的图片存储在受保护的目录中,并拒绝.htaccess访问 deny from all

当您的用户上传图片时,您应该在图片商店中创建唯一的文件名。然后,您可以使用特定图像ID的图像处理程序来提供图像:

<?php 
    header('Content-Type:image/jpeg'); 
    if(authorized && isset($_GET['id']))
    {
        flush();
        readfile('someimage' . $_GET['id'] . '.jpg');
    }
?>

答案 3 :(得分:0)

3,存储在Web根目录之外的文件夹中。

确保该目录是一个配置选项,因为如果大小太大或者前端节点的数量增加,您可能希望将来存储在单独的计算机上。

2提示:

  1. 将文件重命名为GUID或其他唯一名称,并将实名存储在数据库中。这样可以防止任何重复的文件名冲突。
  2. 创建文件夹系统,因此并非所有文件都在同一目录中。文件夹中的文件数量有限制。并将路径存储在数据库中。 (即日期基础文件夹[YYYY] [MM] [DD] [File.Ext])