Cách tốt nhất để đặt tên hình ảnh được tải lên là gì?


15

Giả sử tôi có một biểu mẫu trong ứng dụng web của mình, nơi người dùng có thể tải lên hình ảnh hồ sơ.

Tôi đã có một vài yêu cầu về kích thước tệp, kích thước, v.v., nhưng khi người dùng tải lên hình ảnh, tôi nên đặt tên chúng như thế nào trên hệ thống của mình? Tôi cho rằng nó sẽ cần phải nhất quán và cũng là duy nhất.

Có lẽ là một HƯỚNG DẪN?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

Dấu thời gian?

129899740140465735.jpg

Một hàm băm? Vd: md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

Có một cách tiêu chuẩn hoặc đề nghị để làm điều này?


7
Nếu mục tiêu của bạn là chỉ lưu trữ một hình ảnh hồ sơ cho mỗi người dùng, một số người sẽ nói rằng lựa chọn rõ ràng sẽ là đặt tên tệp giống như id người dùng.
Alan Barber

dấu thời gian không phải là một ý tưởng hay, bởi vì DateTime. Bây giờ chỉ được làm mới mỗi 15ms. Có khả năng xảy ra va chạm cao, ví dụ như trong khi tải hàng loạt, yêu cầu xếp hàng, v.v.
jhapi

Câu trả lời:


27

Bạn nên cố gắng đáp ứng hai mục tiêu: Tính độc đáo và tính hữu dụng.

Sử dụng GUID đảm bảo tính duy nhất, nhưng một ngày nào đó các tệp có thể bị tách ra khỏi nguồn ban đầu của chúng, và sau đó bạn sẽ gặp rắc rối.

Giải pháp điển hình của tôi là nhúng thông tin quan trọng vào tên tệp, chẳng hạn như userID (nếu thuộc về người dùng) hoặc ngày và thời gian tải lên (nếu điều này là quan trọng) hoặc tên tệp được sử dụng khi tải lên.

Điều này thực sự có thể cứu làn da của bạn một ngày nào đó, khi thông tin được nhúng trong tên tệp cho phép bạn, ví dụ, khôi phục từ một lỗi hoặc xóa các bản ghi vô tình. Nếu tất cả những gì bạn có là GUID và bạn mất danh mục, bạn sẽ có một công việc dọn dẹp.

Ví dụ: nếu một tệp "Kỳ nghỉ của tôi: Florida 23.jpg" được tải lên, bởi userID 98765, vào 2013/04/04 lúc 12:51:23 tôi sẽ đặt tên nó giống như thế này, thêm một chuỗi ngẫu nhiên ad8a7dsf9:

20130404125123-ad8a7dsf9-98765-my-holiday-florida-23.jpg

  • Tính duy nhất được đảm bảo theo ngày và thời gian và chuỗi ngẫu nhiên (miễn là nó ngẫu nhiên chính xác từ / dev / urandom hoặc CryptGenRandom.
  • Nếu tệp đã bị tách ra, bạn có thể xác định người dùng, ngày và giờ và tiêu đề.
  • Mọi thứ được gấp lại thành chữ thường và mọi thứ không phải là chữ và số được loại bỏ và thay thế bằng dấu gạch ngang, giúp cho tên tệp dễ xử lý bằng các công cụ đơn giản (ví dụ: không có khoảng trắng nào có thể nhầm lẫn giữa các tập lệnh viết sai, không có dấu hai chấm hoặc các ký tự khác bị cấm trên một số hệ thống tệp , và như thế).

7
Vì mục đích vệ sinh, tôi khuyên bạn nên tạo các thư mục riêng cho mỗi userID để nếu bạn xóa người dùng, bạn sẽ không phải tìm kiếm tất cả các hình ảnh của họ. - vì vậy98765/20130404125123-ad8a7dsf9-my-holiday-florida-23.jpg
Shadur

1
Tính duy nhất về mặt lý thuyết không được cung cấp bởi chuỗi ngẫu nhiên.
Kolyunya

4
@Kolyuny, điều đó đúng, theo nghĩa được bảo đảm tính duy nhất toàn cầu không phải là một tài sản mà ngay cả GUID cũng có trong đời thực, (ngay cả các guids v1 cũng bị vỡ do phát hành địa chỉ MAC trùng lặp). Tất cả bạn có thể nhận được là một khả năng thống kê của tính duy nhất. Nhưng bạn có thể đảm bảo tính duy nhất bằng cách kiểm tra xem tệp đã tồn tại chưa (sử dụng nguyên bản CreateFilevới CREATE_NEW) và sử dụng tính ngẫu nhiên khác nhau nếu có.
Ben

'Mọi thứ được gấp lại thành chữ thường và mọi thứ không phải là chữ và số được xóa và thay thế bằng dấu gạch ngang,' tôi sẽ giữ trường hợp hỗn hợp, xóa tất cả các số không alpha và thay thế bằng điểm số trừ dấu gạch ngang cuối cùng
tgkprog

4

Bạn không muốn làm căng thẳng các ứng dụng (như Explorer) và làm cho nó bị sập khi bạn mở thư mục. Mặc dù không chắc là bạn sẽ nhấn mạnh hệ thống tệp thực tế, bạn cần tính đến điều này nếu bạn sẽ lưu trữ hàng ngàn tệp.

Nếu bạn muốn lưu trữ hàng ngàn tệp, đề xuất của tôi là phân vùng vào các thư mục. Ví dụ upload\silo001, upload\silo002v.v. Bạn có thể cân bằng các tệp của mình hoặc đợi cho đến khi một thư mục chạm vào một số lượng tệp nhất định rồi tạo tệp khác.

Liên quan đến việc đặt tên, tôi luôn đặt tên tệp bằng GUID vì nó là duy nhất trên toàn cầu. Tôi kéo phần mở rộng từ tải lên và đặt phần mở rộng của tệp để khớp, nhưng tên thực tế được đặt từ một Hướng dẫn mới.

Nếu bạn đang làm điều này kết hợp với RDBMS và có một số danh mục, ví dụ như sản phẩm, danh mục, v.v. bạn có thể có upload\products, upload\categoriesv.v. và bạn có thể sử dụng ID hàng làm tên tệp.

Về mặt thực hành tốt nhất, tôi cũng đã nhìn vào quá khứ và không tìm thấy gì. Tôi đã đưa ra những điều trên trong khi thảo luận với một số nhà phát triển của tôi.


2

Trong một trong những giải pháp tôi đã làm việc cách đây nhiều năm, chúng tôi đã làm điều này: thư mục con cho một phần của id người dùng vì vậy nếu id người dùng của bạn là 232950192

chúng ta sẽ có các thư mục con hình ảnh / 23/29/50/192/22950192

trong thư mục cuối cùng có các thư mục cho albun và hồ sơ cá nhân, v.v.

Nhưng chúng tôi cũng lưu mọi thứ trong cơ sở dữ liệu và giữ nó trong hệ thống tệp để truy cập máy chủ web nhanh (cũng có bộ nhớ đệm)

Dù sao hình ảnh cuối cùng sẽ có tên hình ảnh ban đầu. Chúng tôi không cần phải giữ phiên bản. Nhưng đối với những gì có thể giữ nhiều thư mục phụ dưới tên album cuối cùng hoặc trong cơ sở dữ liệu với id phiên bản. cần phải nghĩ rằng vì một khi nó đi vào sản xuất sẽ khó thay đổi mọi thứ mà không tốn thời gian và dễ bị sửa lỗi trong cấu trúc hiện tại

Rất dễ dàng để tạo một thư mục con trong java và tạo một tệp trong đó:

    File folder = new File(pathwithslashes);// like "images/23/29/50/192/232950192"
    folder.mkdirs();
    File imgFile = new File(folder, name);
    //Now get output stream etc

Để lấy dấu ngày trong các thư mục con: SimpleDateFormat sdf = new SimpleDateFormat ("/ yyyy / MM / dd /"); đường dẫn

Chấm mạng /programming/5482230/c-sharp-equivalent-of-javas-mkdirs


+1 để đề xuất các thư mục lồng nhau. Tôi nghĩ điều này rất quan trọng để xem xét vì các hệ thống tệp khác nhau có thể gặp phải sự cố về hiệu suất khi các thư mục chứa tệp "quá nhiều": stackoverflow.com/questions/197162/ , , .m.mrosrosoft.com/kb/130694/en-us , v.v.
deizel

1
có trên một hệ thống khác có một trong những lỗi của máy chủ web khi chúng tôi cố gắng rmdir trên một thư mục có hơn 400.000 tệp. chúng tôi đã có nhiều thư mục như thế này. vì vậy sau đó sử dụng một chương trình tùy chỉnh có tên dir / p để lấy một vài tệp để xóa cùng một lúc. mất vài giờ nhưng không mất thời gian :)
tgkprog

1

Tôi khuyên bạn chỉ nên sử dụng md5 hoặc bất cứ thứ gì tương đương về mặt khái niệm. Bằng cách đổi tên các tệp bằng cách tiêu hóa nội dung của nó, bạn không chỉ cấp tính duy nhất (luôn luôn lưu trữ hình ảnh trong thời gian lâu nhất có thể, và với việc đổi tên dựa trên nội dung, với một cái phù hợp, bạn có thể lưu trữ hình ảnh thực tế mãi mãi).

Ngoài ra, không phải là một vấn đề lớn, tuy nhiên nó không phải là một trường hợp giả định thuần túy khi những người dùng khác nhau tải lên chính xác cùng một hình ảnh. Chỉ cần ra khỏi hộp bạn sẽ có một tối ưu hóa lưu trữ dữ liệu nhỏ.

Đối với bất cứ điều gì khác được đề xuất: đối với tôi, tôi là một đối thủ mạnh của việc giữ bất kỳ loại thông tin phụ trợ nào trong một tên tệp. Khi tôi còn trẻ hơn nhiều (và mảnh mai hơn một chút :), tôi đã là một nhà phát triển Perl và có thói quen mơ hồ để lưu trữ nhiều thông tin phụ trợ trong tên tệp như thông thường cho phép tôi, vì các tính năng mô hình chuỗi Perl rất tuyệt vời. Và tôi đã đi đến kết luận rằng, nói về phát triển web, luôn luôn là lựa chọn tốt hơn để giữ dữ liệu được liên kết với tệp riêng biệt với tên tệp.

Hãy nhớ rằng ngày nay, khi các giao diện di động đang thống trị, tên tệp thực tế là một điều ít quan trọng hơn so với 5, 10 năm trước. Nhưng ngay cả khi điều này sẽ rất quan trọng trong bối cảnh ứng dụng của bạn, bạn luôn có thể liên quan đến một số phép thuật trường học cũ với việc liên quan đến Content-Disposition: attachment; filename="pretty_file_name.jpg"tiêu đề HTTP, xây dựng bất kỳ tên tệp có liên quan nào bạn muốn. Ngoài ra, các trình duyệt hiện đại đang mở đường cho thuộc tính HTML5 mới, tải xuống . Tôi không tin rằng thực sự nhìn thấy tên hình ảnh "con người có thể đọc được" là điều bạn nên suy nghĩ trong phần lớn các trường hợp.

CẬP NHẬT: Một sửa đổi có thể được thực hiện để không có quá nhiều tệp trong một thư mục - chỉ cần lấy 3 chữ cái đầu tiên và tạo thư mục.


1
md5 có thực sự độc đáo không?
I.devries

@ I.devries, tôi không phải là chuyên gia, nhưng theo tôi biết, nó đủ tốt cho mục đích này. Đặc biệt là nếu bạn sẽ kiểm tra thêm kích thước của tập tin, vì thuật toán tốt băm thực sự cấp mà các đơn vị cùng kích thước nhỏ có thể sẽ có một vụ va chạm - stackoverflow.com/questions/2442632/...
shabunc

-1

Cơ hội va chạm với thứ gì đó như sha4 là vô cùng lớn. Nếu bạn kết hợp hàm băm với userid hoặc thậm chí là một ngày đơn giản, thậm chí ít hơn như vậy.

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.