BUGFIX: Handle filename deduping when uploading of double-barrelled extensions and files ending in numbers better. (from r99818)

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@105531 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Ingo Schommer 2010-05-25 03:04:55 +00:00
parent d00d876efe
commit c193d27f31

View File

@ -212,8 +212,7 @@ class Folder extends File {
if(!is_array($tmpFile)) { if(!is_array($tmpFile)) {
user_error("Folder::addUploadToFolder() Not passed an array. Most likely, the form hasn't got the right enctype", E_USER_ERROR); user_error("Folder::addUploadToFolder() Not passed an array. Most likely, the form hasn't got the right enctype", E_USER_ERROR);
} }
if(!isset($tmpFile['size'])) {
if(!$tmpFile['size']) {
return; return;
} }
@ -232,19 +231,34 @@ class Folder extends File {
$file = $this->RelativePath . $file; $file = $this->RelativePath . $file;
Filesystem::makeFolder(dirname("$base/$file")); Filesystem::makeFolder(dirname("$base/$file"));
while(file_exists("$base/$file")) { $doubleBarrelledExts = array('.gz', '.bz', '.bz2');
$i = isset($i) ? ($i+1) : 2;
$ext = "";
if(preg_match('/^(.*)(\.[^.]+)$/', $file, $matches)) {
$file = $matches[1];
$ext = $matches[2];
// Special case for double-barrelled
if(in_array($ext, $doubleBarrelledExts) && preg_match('/^(.*)(\.[^.]+)$/', $file, $matches)) {
$file = $matches[1];
$ext = $matches[2] . $ext;
}
}
$origFile = $file;
$i = 1;
while(file_exists("$base/$file$ext")) {
$i++;
$oldFile = $file; $oldFile = $file;
$file = ereg_replace('[0-9]*(\.[^.]+$)',$i . '\\1', $file); $file = "$origFile-$i";
if($oldFile == $file && $i > 2) user_error("Couldn't fix $file with $i", E_USER_ERROR); if($oldFile == $file && $i > 2) user_error("Couldn't fix $file$ext with $i", E_USER_ERROR);
} }
if (move_uploaded_file($tmpFile['tmp_name'], "$base/$file")) { if (move_uploaded_file($tmpFile['tmp_name'], "$base/$file$ext")) {
// Update with the new image // Update with the new image
return $this->constructChild(basename($file)); return $this->constructChild(basename($file . $ext));
} else { } else {
if(!file_exists($tmpFile['tmp_name'])) user_error("Folder::addUploadToFolder: '$tmpFile[tmp_name]' doesn't exist", E_USER_ERROR); if(!file_exists($tmpFile['tmp_name'])) user_error("Folder::addUploadToFolder: '$tmpFile[tmp_name]' doesn't exist", E_USER_ERROR);
else user_error("Folder::addUploadToFolder: Couldn't copy '$tmpFile[tmp_name]' to '$base/$file'", E_USER_ERROR); else user_error("Folder::addUploadToFolder: Couldn't copy '$tmpFile[tmp_name]' to '$base/$file$ext'", E_USER_ERROR);
return false; return false;
} }
} }