Получить расширение файла после загрузки и перемещения файла в Symfony2

Я загружаю файл через Symfony2 и пытаюсь переименовать оригинал, чтобы избежать переопределения того же файла. Это то, что я делаю:

$uploadedFile = $request->files;
$uploadPath = $this->container->getParameter('kernel.root_dir') . '/../web/uploads/';

try {
$uploadedFile->get('avatar')->move($uploadPath, $uploadedFile->get('avatar')->getClientOriginalName());
} catch (\ Exception $e) {
// set error 'can not upload avatar file'
}

// this get right filename
$avatarName = $uploadedFile->get('avatar')->getClientOriginalName();
// this get wrong extension meaning empty, why?
$avatarExt = $uploadedFile->get('avatar')->getExtension();

$resource = fopen($uploadPath . $uploadedFile->get('avatar')->getClientOriginalName(), 'r');
unlink($uploadPath . $uploadedFile->get('avatar')->getClientOriginalName());

Я переименовываю файл следующим образом:

$avatarName = sptrinf("%s.%s", uniqid(), $uploadedFile->get('avatar')->getExtension());

Но $uploadedFile->get('avatar')->getExtension() не дает мне расширение загруженного файла, поэтому я даю неправильное имя файла, как jdsfhnhjsdf. без расширения зачем? Как правильно переименовать файл после или до перехода к конечному пути? Любой совет?

1

Решение

Ну, решение действительно простое, если вы это знаете.

С вами moveд UploadedFileтекущий экземпляр объекта больше не может быть использован. Файл больше не существует, и поэтому getExtension вернется в null, Новый экземпляр файла возвращается из move,

Измените ваш код на (рефакторинг для ясности):

    $uploadPath = $this->container->getParameter('kernel.root_dir') . '/../web/uploads/';

try {
$uploadedAvatarFile = $request->files->get('avatar');

/* @var $avatarFile \Symfony\Component\HttpFoundation\File\File */
$avatarFile = $uploadedAvatarFile->move($uploadPath, $uploadedAvatarFile->getClientOriginalName());

unset($uploadedAvatarFile);
} catch (\Exception $e) {
/* if you don't set $avatarFile to a default file here
* you cannot execute the next instruction.
*/
}

$avatarName = $avatarFile->getBasename();
$avatarExt = $avatarFile->getExtension();

$openFile = $avatarFile->openFile('r');
while (! $openFile->eof()) {
$line = $openFile->fgets();
// do something here...
}
// close the file
unset($openFile);
unlink($avatarFile->getRealPath());

(Код не проверен, только что написал) Надеюсь, это поможет!

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]