0

我想创建一种通过 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
}
4

1 回答 1

2

除其他外,这些必须在这样的系统中考虑:

  1. 用户可以上传相同的文件名,但内容不同(警告、更新、替换、重复?)
  2. 用户可以上传相同的文件内容,但使用不同的名称(警告、更新、替换、重复?)

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

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 或当前用户 ID 和文件名(即:)以检查任何匹配,然后使用算法循环遍历结果集以检查最佳匹配结果:sha1_file md5_fileSELECT ... WHERE file_sha = <computed_sha1> OR (user_id = <current_uid> AND filename = <uploaded_filename>)

  • 如果 SHA1 匹配任何内容,则内容可能已经上传,然后还会比较 MD5 字段。
    • 如果文件属于同一用户(相同user_id),则filename仅在必要时更新
    • 在任何其他情况下,文件内容将被链接,并在数据库中为现有内容创建一个新行(相同file_lnk
  • 如果user_idandfilename相同,则上传相同的文件名
    • 如果相同的文件内容与另一个用户链接,则会创建一个新行,生成一个新的file_lnk和更新的file_shaand file_md5
    • 在任何其他情况下,文件内容已替换为此新内容(file_lnk仅替换实际文件)
  • 在任何其他情况下,都会创建一个新文件和数据库表行
于 2012-11-01T23:27:32.240 回答