Perche' l'apice usato per l'apostrofo e' lo stesso usato come delimitatore di stringa.

Vedi nel tuo stesso script a che serve l'apice. Quindi quando il php incontra l'apice pensa ad una fine stringa ed ovviamente il nome mozzato non esiste nella tua cartella.

Personalmente non permetto l'uso dei caratteri di controllo nel nome del file. Per il database si utilizza il carattere di escape \ per definire il carattere che segue come stringa e non come controllo.

gallery/img/L\'illusione

E' un problema che non ho mai dovuto affrontare nel nome dei file perche' non ne permetto l'uso. Quando capita lo faccio sostituire con _