Пользователи из приложения бэкенда могут загрузить файлы и опубликовать их к frontend. Используя sfWidgetFormInputFile и sfValidatorFile, я хотел бы сохранить исходное имя файла вместо функциональности по умолчанию случайной строки (т.е. Meaningful_filename.docx вместо a4b25e9f48cfb6268f34b691fc18cd76fefe96b5.docx - числа могут быть добавлены на двойные названия). Это может быть полезно в сценариях, где пользователь загружает несколько файлов и не смог бы сказать им кроме имени файла.
$this->widgetSchema['file_name'] = new sfWidgetFormInputFile(array('label' => 'File'));
$this->validatorSchema['file_name'] = new sfValidatorFile(array(
'required' => true,
'path' => sfConfig::get('sf_upload_dir').DIRECTORY_SEPARATOR.sfConfig::get('app_dir_file_sharing').DIRECTORY_SEPARATOR,
'mime_types' => array('application/msword',
'application/vnd.ms-word',
'application/msword',
'application/msword; charset=binary')
), array(
'invalid' => 'Invalid file.',
'required' => 'Select a file to upload.',
'mime_types' => 'The file must be a supported type.'
));
Есть ли стандартная функциональность в sfWidgetFormInputFile виджете или там другое решение этого?
Вы получаете файл, позвонив $ form [«File_Name»] -> GetWalue ()
. Это дает вам объект класса SFVVALIDADEDFILE
, где вы можете вызвать метод GetOriginalName ()
.
Чтобы определить, как файл должен быть сохранен, вы можете сделать это:
Класс SFVALIDATORFILE
принимает опцию, который класс SFVValidatedFile
для использования:
Validated_file_Class: Имя класса, который управляет очищенным загруженным файлом (необязательно)
SFVALIDEDFILE
Класс имеет метод Сохранить
, который вызывает метод GenerateFilename
. Подкласс Этот класс и перезаписать этот метод:
class CustomValidatedFile extends sfValidatedFile {
/**
* Generates a random filename for the current file.
*
* @return string A random name to represent the current file
*/
public function generateFilename()
{
return 'foo bar'// your custom generated file name;
}
}
Вот функция из исходного класса:
public function generateFilename()
{
return sha1($this->getOriginalName().rand(11111, 99999)).$this->getExtension($this->getOriginalExtension());
}
, то вы настраиваете Validator так:
$this->validatorSchema['file_name'] = new sfValidatorFile(array(
'required' => true,
'path' => 'yourpath',
'validated_file_class' => 'CustomValidatedFile',
'mime_types' => array('application/msword',
'application/vnd.ms-word',
'application/msword',
'application/msword; charset=binary')
),
array('invalid' => 'Invalid file.',
'required' => 'Select a file to upload.',
'mime_types' => 'The file must be a supported type.')
);
Надеюсь, что поможет!
После некоторых исследований:
, когда вы можете расширить SFVVALIDALEDFILE и переопределить GenerateFileName, я обнаружил, что SfformPropel проверяет существование метода на основе имени столбца для модели для имени файла.
От Symfony / Plugins / SFPropelplugin / Lib / Form Line 292:
$method = sprintf('generate%sFilename', $column);
if (null !== $filename)
{
return $file->save($filename);
}
else if (method_exists($this, $method))
{
return $file->save($this->$method($file));
}
Следовательно, если ваш столбец называется файл_name, метод ищет существование GenerateFileNameFileName в классе формы. Таким образом, вам нужно только добавить один метод в свой класс форм, а не расширять виджет SFVALIDALIFEDFILE. Например, моя функция использует исходное имя, если он не предпринимается, в противном случае добавляет последовательный номер (один метод - рекурсивно проверять сгенерированное имя файла):
public function generateFileNameFilename($file = null)
{
if (null === $file) {
// use a random filename instead
return null;
}
if (file_exists($file->getpath().$file->getOriginalName())) {
return $this->appendToName($file);
}
return $file->getOriginalName();
}
public function appendToName($file, $index = 0)
{
$newname = pathinfo($file->getOriginalName(), PATHINFO_FILENAME).$index.$file->getExtension();
if (file_exists($file->getpath().$newname)) {
return $this->appendToName($file, ++$index);
} else {
return $newname;
}
}
Я не могу найти это документировано в API Symfony в любом месте, почему Это потребовало некоторых поисков кодовой базы, чтобы найти. Если вы используете этот метод во многих местах, расширение SFVaidatedFile может быть хорошим вариантом тоже.
. obj.instance_variable_set ("@ indict_variable", значение)
или или
obj.send ("instance_variable =", значение)
.
Первый напрямую устанавливает переменную экземпляра. Последнее вызывает метод установки, который, конечно, работает только в том случае, если есть метод сеттера, но с другой стороны также работает, если у вас есть метод сеттера, который на самом деле устанавливает только переменную экземпляра (или не устанавливает экземпляр переменная вообще).
-121--3612762-В соответствии с документацией Symfony «Validator SFVALIDATORFILE проверяет загруженный файл. Валидатор преобразует загруженный файл в экземпляр класса SFVALIDALICEDFILE или валидации_file_class, если оно установлено." (Источник: http://www.symfony-project.org/forms/1_4/en/b-validators#Chapter_b_sub_sfvalidatorfile )
Хотя класс SFVALIDALIDALIVEDFILE переименен вправо из коробки, вы можете Переопределите эту функцию, устанавливая Vericated_file_Class в пользовательский класс и расширяя SFVALIDADEDFILE.
В вашем пользовательском определенном классе файлов передайте свое пользовательское имя файла в метод SAVE (). «Если вы не передадите имя файла, он будет сгенерирован методом GenerateFileName». (Источник: http://www.symfony-project.org/api/1_4/sfvvalidatedfile#method_save )
Вот один из способов сделать это (Источник: http: //forum.symfony- Project.org/index.php/m/90887/#msg_90887) ...
Пользовательский проверенный класс файлов:
// lib/validator/myValidatedFile.php
class myValidatedFile extends sfValidatedFile {
private $savedFilename = null;
// Override sfValidatedFile's save method
public function save($file = null, $fileMode = 0666, $create = true, $dirMode = 0777) {
// This makes sure we use only one savedFilename (it will be the first)
if ($this->savedFilename === null) $this->savedFilename = $file;
// Let the original save method do its magic :)
return parent::save($this->savedFilename, $fileMode, $create, $dirMode);
}
}
Убедитесь, что установить «Validated_file_Class» => 'myValidatefile'
Для SFWIDGETFORMINPUTFILE. А установить логику для того, что имя файла будет в способе сохранения формы.