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. ユーザーは同じファイル コンテンツを別の名前でアップロードできます (警告、更新、置換、複製?)

私が設計しなければならなかったシステムでは、数年前、アップロードされたファイルは同じユーザーでのみ置き換えられなければならず、異なるユーザーがまったく同じファイル名またはコンテンツをアップロードできました (データの重複を避けるために、既存のファイル名にリンクする必要がありました) )、ただし、内容が異なる場合、ファイルはまったく同じ名前 (2 人の異なるユーザーに割り当てられている) で 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ヒューリスティックに基づいて計算されたパスを含む、サーバー上のターゲット ファイルです。

基本的に、私はアップロードされたファイルに対してandを使用し(まだアップロード一時ファイルに直接あります)、データベースでアップロードされたファイルを探しました。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_idとが同じ場合filename、同じファイル名がアップロードされました
    • 同じファイル コンテンツが別のユーザーにリンクされている場合、新しい行が作成され、新しい行が生成され、file_lnkと が更新file_shaされfile_md5ます。
    • それ以外の場合、ファイルの内容はこの新しい内容に置き換えられました (実際のfile_lnkファイルのみを置き換えます)
  • それ以外の場合は、新しいファイルとデータベース テーブルの行が作成されました
于 2012-11-01T23:27:32.240 に答える