如何拒绝使用PHP上传相同的图像

时间:2012-11-01 23:03:36

标签: php image upload directory duplicates

我想在图像上传到该指针之前创建一种通过Imagetype或类似变量来搜索目录的方法。

我的目标是使用php搜索该目录中的图像BLOB,如果任何结果匹配(意味着将重复上传相同图像),则返回“已上传文件”。

这只适用于图像文件......

以下是我认为我也可以添加的代码..

// Elements (values) of $_FILES['ImageFile'] array
//let's access these values by using their index position
$ImageName      = str_replace(' ','-',strtolower($_FILES['ImageFile']['name'])); 
$ImageSize      = $_FILES['ImageFile']['size']; // Obtain original image size
$TempSrc        = $_FILES['ImageFile']['tmp_name']; // Tmp name of image file stored in PHP tmp folder
$ImageType      = $_FILES['ImageFile']['type']; //Obtain file type, returns "image/png", image/jpeg, text/plain etc.

//Let's use $ImageType variable to check wheather uploaded file is supported.
//We use PHP SWITCH statement to check valid image format, PHP SWITCH is similar to IF/ELSE statements 
//suitable if we want to compare the a variable with many different values
switch(strtolower($ImageType))
{
    case 'image/png':
        $CreatedImage =  imagecreatefrompng($_FILES['ImageFile']['tmp_name']);
        break;
    case 'image/gif':
        $CreatedImage =  imagecreatefromgif($_FILES['ImageFile']['tmp_name']);
        break;          
    case 'image/jpeg':
    case 'image/pjpeg':
        $CreatedImage = imagecreatefromjpeg($_FILES['ImageFile']['tmp_name']);
        break;
    default:
        die('Unsupported File, Please Check File And Try Again!'); //output error and exit
}

1 个答案:

答案 0 :(得分:2)

除此之外,还必须考虑这些系统:

  1. 用户可以上传相同的文件名,但内容不同(警告,更新,替换,复制?)
  2. 用户可以上传相同的文件内容,但名称不同(警告,更新,替换,复制?)
  3. 在我必须设计的系统中,几年前,上传的文件只能在同一用户上更换,不同的用户可以上传完全相同的文件名或内容(必须将其链接到现有的文件名)避免重复数据),但如果内容不同,则文件必须以完全相同的名称存在两次(分配给两个不同的用户)。

    Db表看起来像:

    CREATE TABLE user_files (
       id INT UNSIGNED NOT NULL PRIMARY KEY,
       user_id INT UNSIGNED NOT NULL,
       ...   -- other fields
       filename VARCHAR(256) NOT NULL,  -- the original file name
       file_sha VARCHAR(40) NOT NULL,   -- the content SHA1
       file_md5 VARCHAR(16) NOT NULL,   -- the content MD5
       file_lnk VARCHAR(1024) NOT NULL, -- uniqid(sha1(originalFilename)) *
       ...   --- other fields
    )
    

    [*] file_lnk字段是服务器上的目标文件,包括基于某些启发式的计算路径

    基本上,我在上传的文件中使用了sha1_file md5_file(直接在上传文件中),并在数据库中查找上传的文件;从数据库中查询SHA1或当前用户ID和文件名(即:SELECT ... WHERE file_sha = <computed_sha1> OR (user_id = <current_uid> AND filename = <uploaded_filename>))以检查是否有匹配,然后使用算法循环结果集以检查最佳匹配结果:

    • 如果SHA1匹配任何内容,那么内容可能已经上传,那么MD5字段也会被比较。
      • 如果文件属于同一用户(同一user_id),则filename仅在必要时更新
      • 在任何其他情况下,文件内容将被链接,并且在数据库中为现有内容创建了新行(相同file_lnk
    • 如果user_idfilename相同,则上传相同的文件名
      • 如果相同的文件内容与其他用户相关联,则会创建一个新行,生成新的file_lnk并更新file_shafile_md5
      • 在任何其他情况下,文件内容已替换为此新内容(仅替换实际的file_lnk文件)
    • 在任何其他情况下,创建了新文件和数据库表行