2010-02-25 34 views
6

Trong khi tải ảnh mới lên máy chủ Linux bằng PHP, tôi phải cung cấp cho họ tên duy nhất (sử dụng tên tệp của nó bị loại trừ). Không có tương tác với DB nên việc nhận ID duy nhất cũng không thể thực hiện được.Cách tạo tên tệp ngắn cho ảnh đã tải lên?

Tôi đã nghĩ đến việc sử dụng DATE + TIME.jpg, nhưng điều đó quá dài.

Vậy phương pháp nào tốt nhất để tạo các tên duy nhất ngắn nhất có thể với PHP?

Trả lời

8

Sử dụng tempnam().

$filename = tempnam ($dir, $prefix) 

Tạo tệp có tên duy nhất trong thư mục được chỉ định. Tên tệp được tạo là khá ngắn và được đảm bảo là duy nhất.

+0

Tệp được tạo không có phần mở rộng và thêm tiện ích mở rộng theo cách thủ công sẽ phá vỡ bảo đảm duy nhất. – Farhadi

0

Nếu tôi là bạn, tôi chỉ tạo một số ngẫu nhiên dài khoảng 6 ký tự và thực hiện trong một vòng lặp do {} (while) cho đến khi nó là duy nhất.

0

Một cách là chỉ sử dụng tên tệp ngẫu nhiên. Giống như rand(0,99999999)+".jpg". Xác suất xảy ra va chạm là rất nhỏ (nếu bạn không có nhiều hình ảnh), và bạn có thể dễ dàng kiểm tra nếu có một số cơ hội quái dị, tên này đã được lấy và lấy tên mới trong trường hợp đó.

+0

Tôi sẽ tư vấn mạnh mẽ về điều này: Tùy thuộc vào cách trình tạo số ngẫu nhiên được tạo hạt giống, bạn có thể gặp phải các va chạm nhanh đáng ngạc nhiên. –

2

Bạn cũng có thể sử dụng cùng một loại băm mà các công cụ rút gọn url như bit.ly sử dụng để tạo tên thư mục 5 ký tự duy nhất của chúng (ví dụ: bit.ly/x3hs0).

There's an implementation in PHP here.

0

Ngắn nhất không phải là cách tốt nhất. Tôi nghĩ bạn có thể sử dụng hàm md5 ($ date + $ time) để lấy tên tệp duy nhất. Nó sẽ như thế này: 8d41627e46d5b8556d0d3e30ec15538e.

Ngoài ra, Nếu bạn nghĩ rằng sẽ có số lượng lớn các tập tin được tải lên, bạn có thể chia cấu trúc thư mục của bạn bằng cách thư mục với tên, ví dụ, bao gồm 2 chữ cái đầu tiên của md5() băm:

8d/ 
    + 8d41627e46d5b8556d0d3e30ec15538e.jpg 
    + 8d897234ed899a523c88273c009c12c2.jpg 
ce/ 
    + ce2389898ace097cc667e134abb61729.jpg 
... 
1

Tạo tệp chỉ mục; tệp này chứa ID cuối cùng được sử dụng cho tệp. Khi một tập tin mới cần phải được tạo:

  1. khóa các tập tin chỉ mục (nếu hệ điều hành của bạn hỗ trợ nó)
  2. Đọc ID
  3. Thêm 1 tới ID
  4. Lưu file
  5. Mở khóa file
  6. Tạo một tập tin với ID mà

regards,
Stijn

+0

Đề xuất điều này, vì nó sau đó làm cho nó ** rất dễ dàng cho người khác để chỉ duyệt hình ảnh của bạn bằng cách chỉ thay đổi số (có thể không phải là những gì bạn muốn). –

+0

Đúng; nếu bạn không muốn điều này thì chỉ sử dụng số tăng không phải là một lựa chọn. Mặc dù bạn cũng có thể tăng nó lên 13 ví dụ thay vì 1; hoặc thêm số đầu tiên của id hiện tại, ... –

1

Vâng, vấn đề là bạn muốn một cái gì đó độc đáo và ngắn. Bạn thực sự không thể có cả hai.

Biểu thị dày đặc nhất của một số ngẫu nhiên có thể đọc được bằng con người sẽ giống như base64 (thay thế các ký tự hợp lệ cho bất kỳ ký tự nào không có trong tên tệp). Tuy nhiên điều đó vẫn có nghĩa là chỉ có "chỉ" 64 biến thể cho mỗi ký tự trong tên tệp.

Nếu bạn muốn một tên tệp đơn giản, chỉ cần sử dụng số gia tăng và mã hóa nó trong base64 (hãy bỏ nó ra nếu bạn muốn có độ dài tối thiểu cho tên). Nếu bạn muốn nó không thể đoán được, bạn cần một bộ tạo số ngẫu nhiên, nhưng sau đó bạn cần phải chắc chắn để tránh tăng gấp đôi hoặc bạn sẽ kết thúc ghi đè lên tập tin. Cơ hội cho thảm họa này càng cao thì tên càng ngắn.

Bạn có thể sử dụng tùy chỉnh 64 của riêng mình với nhiều ký tự hơn chỉ 64 do mã hóa đó cung cấp, nhưng sau đó bạn phải kiểm tra xem hệ điều hành của bạn xem tên tệp hợp lệ và bạn vẫn phải đảm bảo khách hàng có thể truy cập nó đúng cách (nếu nó không chỉ là một kho lưu trữ dữ liệu tạm thời). Cách dễ nhất để thực hiện việc này là tạo chuỗi bằng mọi ký tự bạn muốn hợp pháp trong đó và sau đó chuyển đổi số của cơ sở thành bất kỳ độ dài nào của chuỗi (có giải thích về chuyển đổi cơ sở trên Google nếu bạn không biết làm thế nào để làm điều đó). Điều đó sẽ cho phép mật độ thông tin thậm chí còn cao hơn và thậm chí là tên tập tin ngắn hơn.

3

Cách an toàn ngắn nhất là sử dụng chức năng uniqid().

0

Bạn có thể sử dụng một số ngẫu nhiên và ngày + Thời gian schem và kiểm tra xem tên tồn tại trong một thời gian() vòng lặp:

$new_name = md5(rand(0,99999) . date('Ymd') . microtime(true)) . $extension; 
while (file_exists($path . $new_name)) 
    $new_name = md5(rand(0,99999) . date('Ymd') . microtime(true)) . $extension; 

nơi $ new_name là tên viết tắt của tập tin tải lên của bạn

$ mở rộng là phần mở rộng của quý vị nộp (như .jpg)

$ path là đường dẫn đầy đủ của thư mục chứa tập tin đã được lưu

Việc sử dụng rand() cộng microtime (true) inscrease cơ hội để tìm thấy một tên duy nhất cho phát súng đầu tiên ...

1

Những gì tôi luôn luôn làm được thiết lập tên tập tin như là một MD5 băm của tập tin chính nó - tác dụng phụ của việc này là nó tránh tải lên bản sao chiếm không gian, cộng với bạn có thể xác minh tính toàn vẹn dữ liệu khá dễ dàng.

Nếu bạn muốn ngắn hơn, bạn có thể bắt đầu cắt các bit của phần cuối, nhưng bạn càng làm điều này càng có nhiều nguy cơ xảy ra xung đột tên tệp, nhưng trước tiên bạn phải đảm bảo tính duy nhất được cung cấp bạn không tải lên quá nhiều.

Các vấn đề liên quan