Làm cách nào để ngăn người dùng tải lên cùng một tệp (hình ảnh) nhiều lần?


7

Tôi có một loại nội dung, Hình ảnh, cho phép người dùng thêm hình ảnh bằng trường hình ảnh tích hợp của Drupal 7. Tôi muốn tự động ngăn người dùng thêm cùng một hình ảnh (cùng tên tệp, cùng kích thước) nếu có thể. Có cách nào để ngăn chặn tải lên tập tin trùng lặp?

Câu trả lời:


5

Trong mã giả / nhanh, đây là cách tôi sẽ tiếp cận nó. Trong một mô-đun tùy chỉnh ...

  1. Tạo một bảng trong db, với hai cột, fid và md5.

  2. Mỗi lần bạn tạo một tệp, hãy kiểm tra xem md5 () của bất cứ thứ gì bạn cho là duy nhất có trong db đó không, ví dụ:

    a. chọn fid từ BẢNG trong đó md5 = ab3783ea6c83bcd9383eef778

    b. Nếu fid thì oops, đã xuất hiện tập tin blah blah blah

    c. nếu không thì

  3. Lưu trữ tập tin đó là fid và md5 () trong bảng đó.

Bạn có thể đặt tất cả logic này vào móc xác nhận khi bạn đang tạo nội dung hình ảnh. Bạn thậm chí có thể thiết lập các vai trò có thể ghi đè lên nó, v.v.

Bây giờ, đến md5 () ing của sự vật.

  1. Tên tệp dễ dàng thay đổi và tôi không nghĩ rằng nó thực sự được gửi đến drupal - nhưng thay vào đó, nó được tạo ra ở đó sau khi thực tế - vậy bạn có thực sự muốn sử dụng nó không?

  2. Nội dung của tập tin có thể là một cách tiếp cận tốt hơn.

Vì vậy, md5 có thể được tạo ra với md5_file (PATHTOFILE) nhanh chóng.

Bây giờ, giả sử bạn muốn có tùy chọn làm rộng hệ thống này hoặc cho mỗi người dùng, ví dụ: bạn không muốn một người dùng tải lên nhiều bản sao của một hình ảnh hoặc bạn muốn chỉ có một hình ảnh chính xác được tải lên trên toàn hệ thống.

Chỉ cần thêm một cột uid khác vào bảng trên và kiểm tra nó, ví dụ:

chọn fid từ BẢNG trong đó md5 = ... và uid = $ user-> uid

Dù sao, đây chỉ là những suy nghĩ nhanh chóng của tôi sau buổi espresso đầu tiên vào buổi sáng ở D6land. Có lẽ D7 đã tích hợp sẵn một số thứ này và tôi một lần nữa phát minh lại cái bánh xe đó :)


Đây thực chất là cách tiếp cận tôi sắp viết. Nếu bạn biến MD5 thành PK của bảng, logic sẽ trở nên đơn giản hơn một chút vì bạn không thể CHỌN trùng lặp.
mpdon Arena

Tôi đồng ý với PK nếu bạn không muốn cho phép / làm điều đó bởi uid.
Jimajamma

@MPD Tôi sẽ thực hiện fid từ file_managed PK ở đây, để thống nhất. Lược đồ hỗ trợ 'các phím duy nhất'.
Mołot

3

Hiện tại có một mô-đun cho việc này, mô-đun File Hash . Rất cám ơn Jimajamma đã phác thảo cách tiếp cận của anh ấy, cho phép tôi tìm thấy mô-đun này thông qua Google.

Như được hiển thị trong luồng này , mô-đun hiện có thể được sử dụng để vô hiệu hóa tải lên tệp trùng lặp trên toàn cầu.


Làm thế nào để đạt được điều này trong D6? bất kỳ ý tưởng !!!
Bala

Xem câu trả lời của Jimajamma. Một mô-đun mới sẽ cần phải được viết (hoặc backport mô-đun File Hash).
Patrick Kenny

backport có nghĩa là gì ???
Bala

Chuyển mô-đun File Hash từ Drupal 7 trở lại Drupal 6. Các mô-đun Drupal dành riêng cho phiên bản chính mà họ nhắm mục tiêu (6, 7, 8, v.v.), vì vậy, để sử dụng mô-đun Drupal 7 trên Drupal 6, một chuyển đổi sẽ phải được thực hiện. Điều này khó như thế nào phụ thuộc vào độ phức tạp của mô-đun. Một nơi tốt để bắt đầu là mở một yêu cầu tính năng trong hàng đợi vấn đề của mô-đun cho một cổng sau D6 và xem những gì người bảo trì nói.
Patrick Kenny

1

Tôi nghĩ bạn cần phải viết một mô-đun tùy chỉnh để đạt được điều này. Tôi đã làm điều này trước đây trong bit và miếng. Sử dụng một hình thức thay đổi và xem cho các lĩnh vực. Trong đó có được tên và kích thước của tệp, chắc chắn một số biến sẽ có hai cái này.

  1. Hãy thử nếu bạn có thể nhận các giá trị này từ Cơ sở dữ liệu bằng db_query.
  2. Nếu không lưu chúng một cách linh hoạt bằng cách sử dụng "static $ biến_name = $ field ['name']; và tương tự cho kích thước cũng vậy.

Bây giờ hãy thử sử dụng if () và xem if (! [Et ($ field ['name']) &&! [Et ($ field ['size'])). Và dựa trên điều này thiết lập thông báo lỗi trong mẫu.

Hy vọng nó sẽ giúp bạn.


Cách tiếp cận tốt, nhưng bạn có thể đã chia sẻ mã của bạn!
Đấu sĩ

Tôi đã nói rằng tôi đã làm điều này trong bit và miếng, tôi không chắc chắn về cách chính xác để thực hiện điều này :(

1
Nhưng tôi nghi ngờ liệu db_query có thể được sử dụng ở đây hay không. Nhưng cách tiếp cận thứ hai để sử dụng tĩnh sẽ dẫn đến sự không nhất quán. Tôi sẽ không coi đó là một giải pháp lâu dài. Bạn có thể cho một số rõ ràng.
Đấu sĩ

1
cũng có thể nhìn vào hook_presave hook,
Vic

3
Nếu bạn sử dụng presave, điều duy nhất bạn có thể làm vào thời điểm đó là bỏ đặt trường nếu nó không phải là duy nhất và cho người dùng biết về nó sau khi nút được lưu, nếu nó thậm chí có thể được lưu hoàn toàn mà không có trường này. Bất kể cách tiếp cận nào, logic này phải ở dạng xác thực mẫu để người dùng có cơ hội thêm một hình ảnh khác hoặc không lưu nút ở vị trí đầu tiên.
Jimajamma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.