diff --git a/com.woltlab.wcf/fileDelete.xml b/com.woltlab.wcf/fileDelete.xml
index 2c119ca963..937404aa91 100644
--- a/com.woltlab.wcf/fileDelete.xml
+++ b/com.woltlab.wcf/fileDelete.xml
@@ -2771,6 +2771,7 @@
lib/system/html/output/node/HtmlOutputNodeWoltlabSize.class.php
lib/system/html/output/node/QuoteHtmlOutputNode.class.php
lib/system/image/Thumbnail.class.php
+ lib/system/importer/UserAvatarImporter.class.php
lib/system/language/I18nPlural.class.php
lib/system/language/LanguageServerProcessor.class.php
lib/system/language/preload/LanguagePreloader.class.php
diff --git a/com.woltlab.wcf/objectType.xml b/com.woltlab.wcf/objectType.xml
index 567b539407..8886287ade 100644
--- a/com.woltlab.wcf/objectType.xml
+++ b/com.woltlab.wcf/objectType.xml
@@ -432,11 +432,6 @@
com.woltlab.wcf.importer
wcf\system\importer\UserOptionImporter
-
- com.woltlab.wcf.user.avatar
- com.woltlab.wcf.importer
- wcf\system\importer\UserAvatarImporter
-
com.woltlab.wcf.user.comment
com.woltlab.wcf.importer
@@ -1804,5 +1799,8 @@
com.woltlab.wcf.rebuildData
+
+ com.woltlab.wcf.importer
+
diff --git a/wcfsetup/install/files/lib/data/file/FileEditor.class.php b/wcfsetup/install/files/lib/data/file/FileEditor.class.php
index 50564a6e8d..d3e5ac3d57 100644
--- a/wcfsetup/install/files/lib/data/file/FileEditor.class.php
+++ b/wcfsetup/install/files/lib/data/file/FileEditor.class.php
@@ -117,7 +117,8 @@ public static function createFromTemporary(FileTemporary $fileTemporary): File
public static function createFromExistingFile(
string $pathname,
string $originalFilename,
- string $objectTypeName
+ string $objectTypeName,
+ bool $copy = false
): ?File {
if (!\is_readable($pathname)) {
return null;
@@ -174,10 +175,11 @@ public static function createFromExistingFile(
\mkdir($filePath, recursive: true);
}
- \rename(
- $pathname,
- $filePath . $file->getSourceFilename()
- );
+ if ($copy) {
+ \copy($pathname, $filePath . $file->getSourceFilename());
+ } else {
+ \rename($pathname, $filePath . $file->getSourceFilename());
+ }
return $file;
}
diff --git a/wcfsetup/install/files/lib/system/importer/UserAvatarImporter.class.php b/wcfsetup/install/files/lib/system/importer/UserAvatarImporter.class.php
deleted file mode 100644
index c1bcb2ace0..0000000000
--- a/wcfsetup/install/files/lib/system/importer/UserAvatarImporter.class.php
+++ /dev/null
@@ -1,89 +0,0 @@
-
- */
-class UserAvatarImporter extends AbstractImporter
-{
- /**
- * @inheritDoc
- */
- protected $className = UserAvatar::class;
-
- /**
- * @inheritDoc
- */
- public function import($oldID, array $data, array $additionalData = [])
- {
- // check file location
- if (!\is_readable($additionalData['fileLocation'])) {
- return 0;
- }
-
- // get image size
- $imageData = @\getimagesize($additionalData['fileLocation']);
- if ($imageData === false) {
- return 0;
- }
- $data['width'] = $imageData[0];
- $data['height'] = $imageData[1];
- $data['avatarExtension'] = ImageUtil::getExtensionByMimeType($imageData['mime']);
- $data['fileHash'] = \sha1_file($additionalData['fileLocation']);
-
- // check image type
- if ($imageData[2] != \IMAGETYPE_GIF && $imageData[2] != \IMAGETYPE_JPEG && $imageData[2] != \IMAGETYPE_PNG) {
- return 0;
- }
-
- // get user id
- $data['userID'] = ImportHandler::getInstance()->getNewID('com.woltlab.wcf.user', $data['userID']);
- if (!$data['userID']) {
- return 0;
- }
-
- // save avatar
- $avatar = UserAvatarEditor::create($data);
-
- // check avatar directory
- // and create subdirectory if necessary
- $dir = \dirname($avatar->getLocation());
- if (!@\file_exists($dir)) {
- FileUtil::makePath($dir);
- }
-
- // copy file
- try {
- if (!\copy($additionalData['fileLocation'], $avatar->getLocation())) {
- throw new SystemException();
- }
-
- // update owner
- $sql = "UPDATE wcf1_user
- SET avatarID = ?
- WHERE userID = ?";
- $statement = WCF::getDB()->prepare($sql);
- $statement->execute([$avatar->avatarID, $data['userID']]);
-
- return $avatar->avatarID;
- } catch (SystemException $e) {
- // copy failed; delete avatar
- $editor = new UserAvatarEditor($avatar);
- $editor->delete();
- }
-
- return 0;
- }
-}
diff --git a/wcfsetup/install/files/lib/system/importer/UserImporter.class.php b/wcfsetup/install/files/lib/system/importer/UserImporter.class.php
index 7980fc9e45..20b2cf4200 100644
--- a/wcfsetup/install/files/lib/system/importer/UserImporter.class.php
+++ b/wcfsetup/install/files/lib/system/importer/UserImporter.class.php
@@ -2,6 +2,7 @@
namespace wcf\system\importer;
+use wcf\data\file\FileEditor;
use wcf\data\user\group\UserGroup;
use wcf\data\user\option\UserOption;
use wcf\data\user\option\UserOptionList;
@@ -201,6 +202,18 @@ public function import($oldID, array $data, array $additionalData = [])
// assign an interface language
$data['languageID'] = \reset($languageIDs);
+ if (!empty($additionalData['avatarLocation']) && \is_readable($additionalData['avatarLocation'])) {
+ $avatarFile = FileEditor::createFromExistingFile(
+ $additionalData['avatarLocation'],
+ $additionalData['avatarFilename'] ?? \pathinfo($additionalData['avatarLocation'], \PATHINFO_BASENAME),
+ 'com.woltlab.wcf.user.avatar',
+ true
+ );
+ if ($avatarFile !== null) {
+ $data['avatarFileID'] = $avatarFile->fileID;
+ }
+ }
+
// create user
$user = UserEditor::create($data);
$userEditor = new UserEditor($user);