Wie kann verhindert werden, dass Benutzer dieselbe Datei (Bild) mehrmals hochladen?

7

Ich habe den Inhaltstyp "Bild", mit dem Benutzer ein Bild mithilfe des in Drupal 7 integrierten Bildfelds hinzufügen können. Ich möchte nach Möglichkeit automatisch verhindern, dass Benutzer genau dasselbe Bild (denselben Dateinamen, dieselbe Größe) hinzufügen. Gibt es eine Möglichkeit, doppelte Datei-Uploads zu verhindern?

Patrick Kenny
quelle

Antworten:

5

Im Pseudo / Quick-Code würde ich so vorgehen. In einem benutzerdefinierten Modul ...

  1. Erstellen Sie eine Tabelle in der Datenbank mit zwei Spalten, fid und md5.

  2. Überprüfen Sie jedes Mal, wenn Sie eine Datei erstellen, ob sich md5 () von allem, was Sie für einzigartig halten, in dieser Datenbank befindet, z.

    ein. Wählen Sie fid aus TABELLE aus, wobei md5 = ab3783ea6c83bcd9383eef778

    b. Wenn fid dann oops, scheint es bereits Datei bla bla bla zu geben

    c. Andernfalls

  3. Speichern Sie die fid und md5 () dieser Datei in dieser Tabelle.

Sie können all diese Logik in den Validierungs-Hook einfügen, wenn Sie den Bildinhalt erstellen. Sie können sogar Rollen einrichten, die diese überschreiben können usw.

Nun zum md5 () der Dinge.

  1. Der Dateiname kann leicht geändert werden, und ich glaube, er wird sowieso nicht wirklich an Drupal gesendet - sondern nachträglich dort erstellt. Wollen Sie ihn also wirklich verwenden?

  2. Der Inhalt der Datei könnte ein besserer Ansatz sein.

MD5 könnte also mit einer schnellen md5_file (PATHTOFILE) gefüllt werden.

Angenommen, Sie möchten die Möglichkeit haben, dieses System systemweit oder pro Benutzer auszuführen. Sie möchten beispielsweise nicht, dass ein Benutzer mehrere Kopien eines Bildes hochlädt oder dass nur ein genaues Bild systemweit hochgeladen wird.

Fügen Sie der obigen Tabelle einfach eine weitere Spalten-UID hinzu und überprüfen Sie diese ebenfalls, z.

Wählen Sie fid aus TABLE aus, wobei md5 = ... und uid = $ user-> uid

Wie auch immer, dies sind nur meine kurzen Gedanken nach dem ersten Espresso am Morgen hier in D6land. Vielleicht hat D7 schon etwas davon eingebaut und ich erfinde das Rad wieder neu :)

Jimajamma
quelle
Dies ist im Wesentlichen der Ansatz, den ich aufschreiben wollte. Wenn Sie den MD5 zum PK der Tabelle machen, wird die Logik etwas einfacher, da Sie keine Duplikate einfügen können.
mpdonadio
Ich stimme der PK zu, wenn Sie dies nicht auch per UID zulassen / tun möchten.
Jimajamma
@MPD Ich würde hier aus Gründen der Konsistenz fid von file_managed PK machen. Das Schema unterstützt "eindeutige Schlüssel".
Mołot
3

Hierfür gibt es jetzt ein Modul, das File Hash- Modul. Vielen Dank an Jimajamma für die Darstellung seines Ansatzes, mit dem ich dieses Modul über Google finden konnte.

Wie in diesem Thread gezeigt , kann das Modul derzeit verwendet werden, um doppelte Datei-Uploads global zu deaktivieren.

Patrick Kenny
quelle
Wie erreicht man das in D6? irgendeine Idee !!!
Bala
Siehe Jimajammas Antwort. Ein neues Modul muss geschrieben werden (oder das File Hash-Modul zurückportieren).
Patrick Kenny
Backport bedeutet ???
Bala
Portieren Sie das File Hash-Modul von Drupal 7 zurück nach Drupal 6. Drupal-Module sind spezifisch für die Hauptversion, auf die sie abzielen (6, 7, 8 usw.). Um ein Drupal 7-Modul auf Drupal 6 zu verwenden, muss eine Konvertierung durchgeführt werden durchgeführt werden. Wie schwierig dies ist, hängt von der Komplexität des Moduls ab. Ein guter Anfang ist, eine Funktionsanforderung in der Problemwarteschlange des Moduls für einen D6-Backport zu öffnen und zu sehen, was der Betreuer sagt.
Patrick Kenny
1

Ich denke, Sie müssen ein benutzerdefiniertes Modul schreiben, um dies zu erreichen. Ich habe das schon in kleinen Stücken gemacht. Verwenden Sie ein Formular ändern und sehen Sie für die Felder. Dabei erhalten Sie den Namen und die Größe der Datei, sicher, dass eine Variable diese beiden erhalten hätte.

  1. Versuchen Sie, diese Werte mit db_query aus der Datenbank abzurufen.
  2. Wenn nicht, speichern Sie sie dynamisch mit dem Feld "static $ variable_name = $ ['name'] und in ähnlicher Weise auch für die Größe.

Versuchen Sie nun, ein if () zu verwenden und prüfen Sie, ob (! Isset ($ field ['name']) &&! Isset ($ field ['size'])). Und basierend darauf setzen Sie die Fehlermeldung im Formular.

Hoffe es hilft dir.


quelle
Guter Ansatz, aber Sie hätten Ihren Code teilen können!
Gladiator
Ich sagte, dass ich dies in Teilen getan habe, ich bin nicht sicher, wie ich dies genau umsetzen soll :(
1
Ich bezweifle aber, ob die db_query hier verwendet werden kann oder nicht. Der zweite Ansatz zur Verwendung von Statik führt jedoch zu Inkonsistenzen. Ich werde das nicht als langfristige Lösung betrachten. Können Sie etwas Klarheit geben?
Gladiator
1
Vielleicht schauen Sie auch in node_presave hook,
Vic
3
Wenn Sie Presave verwenden, können Sie das Feld an dieser Stelle nur deaktivieren, wenn es nicht eindeutig ist, und den Benutzer darüber informieren, nachdem der Knoten gespeichert wurde, wenn es ohne dieses Feld überhaupt vernünftig gespeichert werden kann. Unabhängig vom Ansatz sollte sich diese Logik in der Formularvalidierung befinden, damit der Benutzer die Möglichkeit hat, ein anderes Bild hinzuzufügen oder den Knoten überhaupt nicht zu speichern.
Jimajamma