سؤال

يمكن للمستخدمين من تطبيق الواجهة الخلفية تحميل الملفات ونشرها إلى الواجهة الأمامية. باستخدام SFWidgetFormInputFile و SfValIdatorFile ، أود الاحتفاظ باسم الملف الأصلي بدلاً من الوظيفة الافتراضية لسلسلة عشوائية (أي معنى infilename.docx بدلاً من A4B25E9F48CFB6268F34B691FC18CD76FEFE96B5.DOCX -DOCX -DUPLICATION. يمكن أن يكون هذا مفيدًا في السيناريوهات التي يقوم فيها المستخدم بتنزيل عدة ملفات ولن يتمكن من إخبارهم بصرف النظر عن اسم الملف.

$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"]->getValue(). هذا يمنحك كائن من الفصل sfValidatedFile حيث يمكنك استدعاء الطريقة getOriginalName().


لتحديد كيفية حفظ الملف ، يمكنك القيام بذلك: sfValidatorFile يقبل الفصل خيارًا sfValidatedFile الفصل للاستخدام:

التحقق من صحة _file_class: اسم الفئة التي تدير الملف الذي تم تحميله (اختياري)

ال sfValidatedFile الفصل لديه طريقة save التي تدعو الطريقة 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());
}

ثم قمت بإعداد المدقق بهذه الطريقة:

$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.')
);

امل ان يساعد!

نصائح أخرى

حسنا، لقد قمت بحلها عن طريق إضافة مستخدم آخر في مجموعة "المقاولة".على الرغم من أنني كنت مسؤولا لجمع الموقع، إلا أنه لم يسمح لي بالموافقة عليها.تسجيل كمستخدم آخر لديه إذن الموافقة حل المشكلة.

وفقًا لوثائق Symfony "يقوم مصادقة SfValIdatorFile بالتحقق من ملف تم تحميله. يقوم المدقق بتحويل الملف الذي تم تحميله إلى مثيل لفئة SfValidatedFile ، أو لخيار التحقق من صحة _file_class إذا تم تعيينه." (مصدر: http://www.symfony-project.org/forms/1_4/en/b-validators#chapter_b_sub_sfvalidatorfile)

على الرغم من أن فئة SFVAlidatedFile تقوم بإعادة تسمية الملفات مباشرة خارج المربع ، يمكنك تجاوز هذه الوظيفة عن طريق تعيين صحة _file_class إلى فئة مخصصة ، وتوسيع sfvalidatedfile.

في فئة الملفات التي تم التحقق من صحتها ، تمرير اسم الملف المخصص إلى طريقة Save (). "إذا لم تقم بتمرير اسم ملف ، فسيتم إنشاؤه بواسطة طريقة GenerateFilename." (مصدر:http://www.symfony-project.org/api/1_4/sfvalidatedfile#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' => 'myValidatedFile' ل sfwidgetforminputfile. ولتعيين المنطق لما سيكون اسم الملف في طريقة حفظ النموذج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top