Apa praktik terbaik untuk memberi nama pada gambar yang diunggah?

15

Misalkan saya memiliki formulir di aplikasi web saya di mana pengguna dapat mengunggah gambar profil.

Saya punya beberapa persyaratan tentang ukuran file, dimensi dll, tetapi ketika pengguna mengunggah gambar, bagaimana saya harus memberi nama pada sistem saya? Saya kira itu harus konsisten dan juga unik.

Mungkin GUID?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

Stempel waktu?

129899740140465735.jpg

Hash? Mis: md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

Apakah ada cara standar atau yang disarankan untuk melakukan ini?

Rowan Freeman
sumber
7
Jika tujuan Anda adalah menyimpan hanya satu gambar profil per pengguna, beberapa orang akan mengatakan pilihan yang jelas adalah menamai file sama dengan id pengguna.
Alan Barber
timestamp bukan ide yang baik, karena DateTime. Sekarang di-refresh hanya setiap 15 ms. Ada kemungkinan besar tabrakan, misalnya selama bulkload, permintaan antri dll.
jhexp

Jawaban:

27

Anda harus mencoba memenuhi dua tujuan: Keunikan, dan kegunaan.

Menggunakan GUID menjamin keunikan, tetapi suatu hari file mungkin terlepas dari sumber aslinya, dan kemudian Anda akan berada dalam masalah.

Solusi khas saya adalah menanamkan informasi penting ke dalam nama file, seperti userID (jika milik pengguna) atau tanggal dan waktu yang diunggah (jika ini penting), atau nama file yang digunakan saat mengunggahnya.

Ini mungkin benar-benar menyelamatkan kulit Anda suatu hari, ketika informasi yang disematkan dalam nama file memungkinkan Anda, misalnya, pulih dari bug, atau penghapusan catatan secara tidak sengaja. Jika yang Anda miliki hanyalah GUID, dan Anda kehilangan katalognya, Anda akan memiliki pekerjaan yang membersihkannya.

Misalnya, jika file "My Holiday: Florida 23.jpg" diunggah, oleh userID 98765, pada 2013/04/04 pada 12:51:23 Saya akan menamainya seperti ini, menambahkan string acak ad8a7dsf9:

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

  • Keunikan dipastikan berdasarkan tanggal dan waktu, dan string acak (asalkan benar acak dari / dev / urandom atau CryptGenRandom.
  • Jika file dilepaskan, Anda dapat mengidentifikasi pengguna, tanggal dan waktu, dan judul.
  • Semuanya dilipat ke huruf kecil dan apa pun yang non-alfanumerik dihapus dan diganti dengan tanda hubung, yang membuat nama file mudah ditangani dengan menggunakan alat sederhana (mis. Tidak ada ruang yang dapat membingungkan skrip yang ditulis dengan buruk, tidak ada titik dua atau karakter lain yang dilarang pada beberapa sistem file , dan seterusnya).
Ben
sumber
7
Demi housekeeping, saya akan merekomendasikan membuat direktori terpisah per userID sehingga jika Anda menghapus pengguna Anda tidak perlu mencari-cari semua gambar mereka. - jadi98765/20130404125123-ad8a7dsf9-my-holiday-florida-23.jpg
Shadur
1
Keunikan secara teoritis tidak disediakan oleh string acak.
Kolyunya
4
@ Kolyuny, itu benar, dalam arti bahwa jaminan keunikan global bukan properti yang bahkan dimiliki oleh GUID dalam kehidupan nyata, (bahkan panduan v1 pun rusak karena penerbitan duplikat alamat MAC). Yang bisa Anda dapatkan adalah kemungkinan statistik keunikan. Tetapi Anda dapat memastikan keunikan dengan memeriksa apakah file tersebut sudah ada (menggunakan CreateFiledengan atom CREATE_NEW), dan menggunakan keacakan berbeda jika itu.
Ben
'Semuanya dilipat ke huruf kecil dan apa pun yang non-alfanumerik dihapus dan diganti dengan tanda hubung,' saya akan menyimpannya huruf besar
besaran
4

Anda tidak ingin menekankan aplikasi (seperti Explorer) dan membuatnya macet ketika Anda membuka direktori. Meskipun tidak mungkin Anda akan menekankan sistem file yang sebenarnya, Anda perlu mempertimbangkan ini jika Anda akan menyimpan ribuan file.

Jika Anda berharap untuk menyimpan ribuan file saran saya adalah mempartisi ke dalam folder. Misalnya upload\silo001, upload\silo002dll. Anda dapat menyeimbangkan file atau menunggu hingga folder menyentuh sejumlah file lalu membuat yang lain.

Sehubungan dengan penamaan, saya selalu memberi nama file dengan GUID karena itu unik secara global. Saya menarik ekstensi dari unggahan dan mengatur ekstensi file agar cocok, tetapi nama sebenarnya ditetapkan dari Panduan baru.

Jika Anda melakukan ini dalam hubungannya dengan RDBMS dan memiliki beberapa kategori, yaitu produk, kategori, dll Anda bisa memiliki upload\products, upload\categories, dan sebagainya, dan Anda bisa menggunakan ID baris sebagai nama file.

Dalam hal praktik terbaik, saya juga telah melihat di masa lalu dan tidak menemukan apa pun. Saya datang dengan hal di atas saat berdiskusi dengan beberapa pengembang saya.

Sam
sumber
2

Dalam salah satu solusi yang saya kerjakan tahun lalu kami melakukan ini: sub folder untuk sebagian id pengguna jadi jika id pengguna Anda adalah 232950192

kita akan memiliki gambar sub folder / 23/29/50/192/232950192

di folder terakhir ada folder untuk albuns dan profil profil dll

Tapi kami juga menyimpan semuanya dalam basis data dan menyimpannya dalam sistem file untuk akses server web cepat (yang juga memiliki caching)

Pokoknya gambar final akan memiliki nama gambar asli. Kami tidak perlu menyimpan versi. Tetapi untuk apa yang dapat menyimpan lebih banyak sub folder di bawah nama album akhir atau dalam basis data dengan id versi. perlu berpikir melalui setelah produksi akan sulit untuk mengubah hal-hal tanpa memakan waktu dan koreksi rawan kesalahan dalam struktur saat ini

Sangat mudah untuk membuat sub folder di java dan membuat file di dalamnya:

    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

Untuk mendapatkan cap tanggal dalam subfolder: SimpleDateFormat sdf = SimpleDateFormat baru ("/ yyyy / MM / dd /"); pathwithslashes = pathwithslashes + sdf.format (sekarang); // sekarang adalah util.Date File folder = File baru (pathwithslashes);

Dot net /programming/5482230/c-sharp-equivalent-of-javas-mkdirs

tgkprog
sumber
+1 untuk menyarankan direktori bersarang. Saya pikir ini penting untuk dipertimbangkan karena sistem file yang berbeda dapat mengalami masalah kinerja ketika folder berisi file "terlalu banyak": stackoverflow.com/questions/197162/… , support.microsoft.com/kb/130694/en-us , dll.
deizel
1
ya di sistem lain ada salah satu server web yang hang ketika kami mencoba rmdir pada aa dir yang memiliki lebih dari 400.000 file. kami memiliki lebih banyak folder seperti ini. jadi kemudian menggunakan program kustom yang disebut dir / p untuk mendapatkan beberapa file untuk dihapus sekaligus. butuh beberapa jam tetapi tidak ada down time :)
tgkprog
1

Saya akan merekomendasikan untuk menggunakan hanya md5 atau apa pun yang secara konsep setara. Dengan mengganti nama file dengan mencerna isinya, Anda tidak hanya memberikan keunikan (selalu cache gambar selama mungkin, dan dengan penggantian nama berbasis konten, baik, dengan yang benar, Anda dapat menyimpan gambar secara praktis selamanya).

Juga, bukan masalah besar, tetapi bagaimanapun itu bukan kasus hipotetis murni ketika pengguna yang berbeda mengunggah gambar yang persis sama. Hanya di luar kotak Anda akan memiliki optimasi penyimpanan data kecil.

Adapun hal lain yang diusulkan: seperti untuk saya, saya adalah lawan yang kuat untuk menjaga segala jenis informasi tambahan dalam nama file. Ketika saya masih jauh lebih muda (dan sedikit lebih ramping :), saya telah menjadi seorang pengembang Perl dan memiliki kebiasaan yang meragukan untuk menyimpan sebanyak mungkin informasi tambahan dalam nama file sebagaimana akal sehat memungkinkan saya, karena fitur-fitur pola string Perl sangat mengagumkan. Dan saya sampai pada kesimpulan bahwa, berbicara tentang pengembangan web, selalu merupakan pilihan yang lebih baik untuk menyimpan data yang terkait dengan file secara terpisah dari nama file.

Perlu diingat bahwa saat ini, ketika antarmuka seluler mendominasi, nama file sebenarnya adalah hal yang kurang penting yaitu 5, 10 tahun yang lalu. Tetapi bahkan jika ini akan sangat penting dalam konteks aplikasi Anda, Anda selalu dapat melibatkan beberapa sihir sekolah lama dengan melibatkan Content-Disposition: attachment; filename="pretty_file_name.jpg"header HTTP, membuat nama file yang relevan yang Anda inginkan. Juga, browser modern membuka jalan untuk atribut HTML5 baru, unduh . Saya tidak percaya bahwa benar-benar melihat nama gambar "dapat dibaca manusia" adalah hal yang harus Anda pikirkan dalam sebagian besar kasus.

UPD: Sebuah modifikasi dapat dilakukan agar tidak memiliki terlalu banyak file dalam satu direktori - cukup ambil 3 huruf pertama dan buat dir.

shabunc
sumber
1
apakah md5 benar-benar unik?
I.Devries
@ I.devries, saya bukan spesialis, tetapi sejauh yang saya tahu, itu cukup baik untuk tujuan ini. Terutama jika Anda juga akan memeriksa ukuran file, karena algoritma hashing yang baik sebenarnya memberikan bahwa entitas ukuran yang sama akan kurang mungkin memiliki tabrakan - stackoverflow.com/questions/2442632/…
shabunc
-1

Peluang tabrakan dengan sesuatu seperti sha4 sangat kecil. Jika Anda menggabungkan hash dengan userid atau bahkan tanggal sederhana, apalagi itu.

Evan Zamir
sumber