Я загружаю файл через 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.
без расширения зачем? Как правильно переименовать файл после или до перехода к конечному пути? Любой совет?
Ну, решение действительно простое, если вы это знаете.
С вами 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());
(Код не проверен, только что написал) Надеюсь, это поможет!
Других решений пока нет …