ユーザーが同じファイル(画像)を複数回アップロードしないようにするにはどうすればよいですか?


7

私は、ユーザーがDrupal 7の組み込み画像フィールドを使用して画像を追加できるコンテンツタイプImageを持っています。可能であれば、ユーザーが完全に同じ画像(同じファイル名、同じサイズ)を自動的に追加しないようにしたいと思います。ファイルの重複アップロードを防ぐ方法はありますか?

回答:


5

擬似/迅速なコードでは、これは私がそれに取り組む方法です。カスタムモジュールで...

  1. 2つの列、fidとmd5を持つテーブルをデータベースに作成します。

  2. ファイルを作成するたびに、一意であると考えるもののmd5()がそのdbにあるかどうかを確認してください。たとえば、

    a。TABLEからfidを選択します。md5= ab3783ea6c83bcd9383eef778

    b。fidがoopsの場合、ファイルblah blah blah

    c。さもないと

  3. そのファイルのfidとmd5()をそのテーブルに保存します。

画像コンテンツを作成するときに、このロジックをすべて検証フックに配置できます。それを上書きできるロールなどを設定することもできます。

さて、物事のmd5()化に。

  1. ファイル名は簡単に変更され、とにかく実際にdrupalに送信されるとは思わない-代わりに事実の後でそこに作成される-本当にそれを使用しますか?

  2. ファイルの内容はより良いアプローチかもしれません。

したがって、md5にはクイックmd5_file(PATHTOFILE)を設定できます。

ここで、このシステム全体またはユーザーごとにこのオプションを実行したいとします。たとえば、1人のユーザーが1つの画像の複数のコピーをアップロードしたくない場合や、システム全体で1つの画像のみをアップロードしたい場合などです。

上記の表に別の列uidを追加し、それも確認してください。例:

TABLEからfidを選択します。md5= ...およびuid = $ user-> uid

とにかく、これらはここD6landでの朝の最初のエスプレッソの後の私の簡単な考えです。たぶん、D7にはすでにいくつかの機能が組み込まれており、そのホイールを再発明しています:)


これは本質的に私が書き込もうとしていたアプローチです。MD5をテーブルのPKにすると、重複をINSERTできないため、ロジックは少し単純になります。
mpdonadio

uidで許可/実行したくない場合は、PKに同意します。
ジマジャマ2012

@MPD一貫性を保つために、ここではfile_managed PKからfidを作成します。スキーマは「一意のキー」をサポートします。
Mołot

3

このためのモジュール、ファイルハッシュモジュールができました。彼のアプローチの概要を説明してくれたJimajammaに感謝します。これにより、Google経由でこのモジュールを見つけることができました。

このスレッドに示されているように、このモジュールは現在、重複ファイルのアップロードをグローバルに無効にするために使用できます。


D6でこれを実現するにはどうすればよいですか?何か案が !!!
Bala

ジマジャンマの答えを見てください。新しいモジュールを作成する(またはファイルハッシュモジュールをバックポートする)必要があります。
Patrick Kenny

バックポートとは???
Bala

Drupal 7からDrupal 6にファイルハッシュモジュールを移植します。Drupalモジュールは、対象とするメジャーリリース(6、7、8など)に固有であるため、Drupal 6でDrupal 7モジュールを使用するには、変換が必要です。実行されます。これがどれほど難しいかは、モジュールの複雑さに依存します。開始するのに適した場所は、D6バックポートのモジュールの課題キューで機能リクエストを開き、メンテナーが言うことを確認することです。
Patrick Kenny

1

これを実現するには、カスタムモジュールを作成する必要があると思います。私は以前、これを少しずつ行ってきました。フォームを使用して、フィールドを確認します。ファイルの名前とサイズを取得するために、いくつかの変数がこれら2つを取得していることを確認してください。

  1. db_queryを使用してデータベースからこれらの値を取得できるかどうか試してください。
  2. そうでない場合は、 "static $ variable_name = $ field ['name'];を使用して動的に保存し、サイズについても同様です。

次に、if()を使用して、if(!isset($ field ['name'])&&!isset($ field ['size']))を確認します。これに基づいて、フォームにエラーメッセージを設定します。

お役に立てば幸いです。


良いアプローチですが、コードを共有することもできます。
Gladiator

私はこれを少しずつ行ったと言いましたが、これを実装する正確な方法は

1
しかし、db_queryをここで使用できるかどうかは疑問です。しかし、静的を使用する2番目のアプローチは、不整合につながります。私はそれを長期的な解決策とは考えません。わかりやすく説明してください。
Gladiator

1
多分node_presaveフックも調べてください
Vic

3
presaveを使用する場合、その時点で実行できる唯一のことは、フィールドが一意でない場合はフィールドの設定を解除し、ノードが保存された後にユーザーに通知することです。このフィールドがなくても問題なく保存できます。アプローチに関係なく、ユーザーが別の画像を追加したり、最初にノードを保存したりしないように、このロジックはフォーム検証に含める必要があります。
ジマジャマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.