Back to Question Center
0

Uložení Semaltu nahraného uživatelem

1 answers:

Jaká je obvyklá praxe při manipulaci s fotografiemi nahranými uživateli a jejich ukládání do databáze a serveru?

Obrázek uživatele:

  1. Po obdržení souboru obrázku od uživatele přejmenujte soubor na _
  2. Přesuňte obrázek na / images / userprofile
  3. Přidejte img jméno souboru do tabulky uživatelů obsahujících jejich detaily profilu jako first_name, last_name, věk, pohlaví, narozeniny

Obrázek pro recenzi provedenou uživatelem:

  1. Po obdržení souboru obrázku od uživatele přejmenujte soubor na _
  2. Přesunout obrázek na / images / reviews
  3. Přidat img filename do tabulky recenze obsahující detaily jejich profilu jako review_id, review_content, user_id, score .

Otázka č Source - super funds ato. 1 : Jak mám jít o uložení názvů souborů obrázků, pokud uživatel může na konkrétní recenzi nahrát více fotografií? Serializujte?

Otázka 2 : Nebo máte jinou tabulku review_images se sloupci review_id, image_id, image_filename právě pro sledování obrázků? Učiní JOIN , když zvedne image_filename z této tabulky výrazně zpomalit výkon?

Otázka 3 : Měly by být všechny obrázky uloženy v jediném adresáři? Bude problém, když máme ve stejném adresáři 100 000 fotografií?

Existuje účinnější způsob, jak to udělat?

February 8, 2018

Krátká odpověď: v databázi není třeba ukládat název souboru obrázku. Stačí přejmenovat soubor, který nahraje, theirusername. jpg a uložit je do / uploads / users / . Dlouho odpověď níže.


Otázka 1: Jak mám jítukládání názvů obrázků v případě, žeuživatel může nahrát více fotografií zakonkrétní přezkum? Serializujte?

Mohli byste:

  1. Oddělovat názvy souborů čárkami a uložit je do jednoho pole obrázky v tabulce . Když načtete obrázky k zobrazení, rozdělte řetězec obrazů čárkou a smyčkou přes toto pole, abyste rozložili obrázky. (Pokud existuje pouze jeden snímek, bude to stále fungovat. )

  2. Vytvořte samostatnou tabulku nazvanou obrázky nebo review_images a uložte každý snímek na svůj vlastní řádek, jak navrhujete ve své druhé otázce.

Otázka 2: Nebo jinou tabulkureview_images se sloupci review_id,image_id, image_filename jen prosledování obrázků? Provede JOINpři získávání souboru_filename ztato tabulka zpomaluje výkonnápadně?

Je nepravděpodobné, že byste zažili znatelný výkonový výsledek za použití jednoduchého JOIN. Jakékoli malé výkony, které uděláte, by mohly být vyloučeny nebo sníženy ukládáním dotazů do mezipaměti a zobrazováním statického HTML.

Otázka 3: Měly by být všechny obrázkyuložen v jediném adresáři?

Navrhuji vám buď:

  1. Vytvořte pro každého uživatele v adresáři / uploads / jednu složku, když nahrají svůj první soubor.
  2. Vytvořte novou složku každý měsíc (automaticky jako součást skriptu pro nahrávání) a nahrajte zde obrázky. To je to, co WordPress dělá ve výchozím nastavení.

Tím se snižuje pravděpodobnost, že dojde k omezení počtu adresářů na počet souborů.

Bude problém, když máme 100 kB fotekve stejném adresáři?

Možná, v závislosti na souborovém systému, který server používá. Existuje omezení počtu souborů, které můžete mít v jednom adresáři. Například FAT32 má limit na 65 535 souborů na jednu složku. Viz "Kolik souborů v adresáři je příliš mnoho?" na přetečení zásobníku. Všimněte si, že používání složek, jak navrhuji výše, snižuje nebezpečí zasažení adresářových limitů.

Existuje účinnější způsob, jak to udělat?

Nemusíte ukládat obrazová data do databáze vůbec, pokud budete postupovat podle jednoduché konvence. Když uživatel například nahraje obrázek profilu, můžete jej přejmenovat na profil. jpg , pak jej uložte do / uploads / users / username / . Potřebujete uživatelské jméno uživatele, abyste získali jeho profilový obrázek. Už nemusíte ukládat odkaz na obrázek v databázi. (Nebo můžete pouze pojmenovat obrázek theirusername. jpg a uložte jej do / uploads / users / - vyberte si, co vám dává smysl. )

Podobně, když uživatel nahraje obrázky pro kontrolu, můžete tyto snímky uložit do složky s názvem / uploads / reviews / 13 / . Číslo 13 na konci by bylo ID přehledu - jedinečné ID tohoto přehledu, jak je uloženo v databázové tabulce. Chcete-li tyto obrázky zobrazit, je ID přehledu vše, co potřebujete k načtení těchto obrázků. (Chcete-li zjistit, jaké obrázky jsou ve složce, můžete prohledat adresář. Pomocí PHP používáte například scandir

. )

Informace o obrázku uložte v databázi (uživatelské jméno, ID obrázku, název souboru) a uchopte jej za JOIN.

Tento podproces na přetečení stacků projednává tentýž nápad, i když jsem nemohl najít přesné vlákno, které bych chtěl odkazovat, což dává lepší vysvětlení. Michael Andrews vysvětluje v jeho blogu některé skutečné praktiky, jak implementovat takovýto program

Základní myšlenkou je, že ukládáte obrázek tím, že hashujete obsah obrázku a použijete tento hash jako název souboru.

  • Řekněme, že váš uživatel nahrává LazyCat. jpg 'jako jejich obraz.
  • SHA1 hash pro tento obrázek by mohl být 'ac17c9e81fc3789ab6b8c1f3325d789e9aa3daaf'
  • Na vašem serveru máte obrazový adresář 'images' Pod obrázky jsou podadresáře pro prvních pár číslic hash, e. G. '/ images / 0000', '/ images / 0001 /', , '/ images / a3df /', , '/ images / ffff /'
  • Postupujte podle tohoto vzoru (aby byl počet souborů v adresáři menší) a uložte soubor do příslušného adresáře, v tomto případě '/ images / ac17 / ac17c9e81fc3789ab6b8c1f3325d789e9aa3daaf'
  • Ve své databázi uložte ID uživatele a odpovídající název souboru.

Pokud více uživatelů nahraje stejný obrázek, je pouze uloženo jednou na serveru. Kdykoli v databázi nemáte žádné další odkazy na tento název souboru, můžete ji smazat.

Já bych držet přirozený název obrázku (přidejte čísla zastavit je přepisovat) a držet je všechny v jedné složce, jako je "uploads". Někdy dělám složku, která není veřejně přístupná, ale přístupná prostřednictvím psovoda, která mi dává větší kontrolu nad ní.

Nikdy nebudou ukládat obrázky do databáze, ale mám relační databázi a ukládám záznamy o každém uploadu, ID uživatele, kdo ho nahrál, název souboru apod.