Я использую PHP (Symfony2) в своем проекте, который имеет функцию загрузки изображений. Внутри контроллера:Загрузка файла PHP создает имена файлов, начинающиеся с «PHP» и с расширением .tmp
if ($request->isXmlHttpRequest() && $request->isMethod('POST')) {
$index=(int)$request->request->get('index');
$image_file = $request->files->get('shop_bundle_managementbundle_posttype')['images'][$index]['file'];
$image= new Image();
$image->setFile($image_file);
$image->setSubDir('hg');
$image->upload();
$em->persist($image);
$em->flush();
}
Я использую класс UploadFileMover
, которые обрабатывают загрузку файла. Я не написал следующий код, но, как я понимаю, хеш MD5 будет создан из исходного имени файла и использоваться как имя файла. Но экземпляр UploadedFile
содержит имя файла, например «PHP» + number.tmp, а не оригинал, хранящийся в компьютерной файловой системе.
класс UploadFileMover {
public function moveUploadedFile(UploadedFile $file, $uploadBasePath,$relativePath)
{
$originalName = $file->getFilename();
$targetFileName = $relativePath . DIRECTORY_SEPARATOR . $originalName;
$targetFilePath = $uploadBasePath . DIRECTORY_SEPARATOR . $targetFileName;
$ext = $file->getExtension();
$i=1;
while (file_exists($targetFilePath) && md5_file($file->getPath()) != md5_file($targetFilePath)) {
if ($ext) {
$prev = $i == 1 ? "" : $i;
$targetFilePath = $targetFilePath . str_replace($prev . $ext, $i++ . $ext, $targetFilePath);
} else {
$targetFilePath = $targetFilePath . $i++;
}
}
$targetDir = $uploadBasePath . DIRECTORY_SEPARATOR . $relativePath;
if (!is_dir($targetDir)) {
$ret = mkdir($targetDir, umask(), true);
if (!$ret) {
throw new \RuntimeException("Could not create target directory to move temporary file into.");
}
}
$file->move($targetDir, basename($targetFilePath));
return str_replace($uploadBasePath . DIRECTORY_SEPARATOR, "", $targetFilePath);
}
}
Этот класс инстанциирован когда изображение загружается. Другими словами, у меня есть Entity Image
, который имеет метод upload
. Внутри класс объекта:
public function upload()
{
if (null === $this->getFile()) {
return;
}
$uploadFileMover = new UploadFileMover();
$this->path = $uploadFileMover->moveUploadedFile($this->file, self::getUploadDir(),$this->subDir);
$this->file = null;
}
Я var_dumped имени файла все через различные шаги, но я не могу понять, где он превращается в PHP16653.tmp.
Может быть, это связано с конфигурацией, связанной с APACHE? Ваша помощь приветствуется. Я действительно много исследовал аналогичную проблему в Интернете, но безрезультатно.