Interessante ipotesi ma... hai controllato se è corretta?
Il file "temporaneo" ha un nome casuale che non contiene mai spazi, tipo /membri/.dummy/temp/php0rpjk6. Il problema non è collegato all'URL encoding: dopo tutto, URL e nomi di file sono insiemi separati, che seguono regole diverse. La direzione è giusta però!
Togliendo caratteri spazio dal nome destinazione, move_uploaded_file() mantiene proprietario e permessi corretti. È possibile quindi spostare un file "senza spazi", e poi dargli il nome originale. Se il file viene usato solo via PHP, o scaricato via FTP, non è un problema se il nome contiene spazi.
Tornando al codice di giornalinothewest:
Codice PHP:
$target_dir = "/membri/giornalinothewest/edAtt/{$usr}/";
$original_name = $_FILES['fileToUpload']['name'];
$safe_name = "UPLOAD-" . md5($original_name) . "-" . str_replace(' ', '-', $original_name);
# [...]
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $target_dir . $safe_name);
rename($target_dir . $safe_name, $target_dir . $original_name);
Il risultato dovrebbe essere un file con i permessi giusti, ed il nome originale.
[edit] Visto che questa può servire ad altri, la metto qua:
Codice PHP:
function av_move_uploaded_file(string $from, string $to) : bool
{
if (strpos($to, ' ') === false) {
return move_uploaded_file($from, $to);
}
$path = dirname($to);
$filename = basename($to);
$unique = md5($filename);
$toWithoutSpaces = str_replace(' ', '-', $filename);
$safeTo = "{$path}/upload-{$unique}-{$toWithoutSpaces}";
return move_uploaded_file($from, $safeTo) && rename($safeTo, $to);
}