Yii2:设置csv文件上传规则并保留原始文件名

时间:2016-11-25 02:51:35

标签: php excel csv yii

我正在使用yii \ web \ UploadedFile按照文档上传excel和csv文件。上传工作完全正常但是,我遇到了一些奇怪的问题,我无法弄清楚如何修复。

  1. 我已经明确规定允许xls,xlsx和csv。 --->上传xls和xlsx没有任何问题,但csv文件抛出“只允许带有这些扩展名的文件:xlsx,xls和csv。”错误。我100%确定我正在上传csv文件。 这种情况有什么特别的原因吗?怎么修好? 现在,我已经通过删除规则的扩展并在扩展名不是xls,xlsx或csv时显示带有错误消息的解决方法,但如果我可以使用规则中的默认值,我会更喜欢它。

  2. 我主要使用日文文件名的文件。即:テスト0001.xlsx和テスト0001.csv。当我尝试回显或转储在yii上生成的文件名时,我得到了正确的文件名但是当我检查uploads文件夹时,文件名变为类似:陬ス蜩√.xlsx。 到目前为止,我已经尝试使用iconv将字符集设置为UTF8而没有运气。我也试过硬编码文件名只是为了检查它是否与实际文件有关,但结果仍然相同。如何在上传文件时保留原始文件名?

2 个答案:

答案 0 :(得分:4)

广告。 1.这是因为checkExtensionByMimeType中有FileValidator个选项。默认设置为true,它验证文件扩展名是否与文件MIME类型匹配。对于csv个文件,MIME通常为text/plain,这会导致验证错误。

解决方案是将checkExtensionByMimeType设置为false以进行此类文件上传。

请参阅discussion about this

广告。你在用什么版本的Yii?在Yii 2.0.10中,文件下载的issue with wrong UTF-8 names encoding已经修复。

如果不是旧版本的情况,或者此问题对保存的文件名没有影响,则可能是您的ICU版本存在问题。
通过运行主Yii 2项目文件夹中的requirements.php检查您的ICU版本,并查找ICU部分。

答案 1 :(得分:0)

我花了一些时间解决类似的问题,即使设置为'mimeTypes'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',也只有xlsx的mimeType无法在后端进行验证 我只需要对xlsx文件类型进行仔细检查,如下所示:

    public function rules()
    {
        return [
            [['file'], 'file', //'extensions' => 'xlsx,xls',
                'mimeTypes'  => [
                    'application/vnd.ms-excel',
                    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                    ],
                'wrongMimeType'=> \Yii::t('app','Only excel files are allowed.'),
                'checkExtensionByMimeType' => false,
                'skipOnEmpty' => false],
        ];
    }

    public function upload() {
         if ($this->file && ($this->validate() || $this->file->type=='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
            $this->file->saveAs('uploads/' . $this->file->baseName . '.' .
               $this->file->extension);
            return true;
         } else {
            return false;
         }
      }

完整示例见:https://yii2-framework.readthedocs.io/en/stable/guide/input-file-upload/

希望这会有所帮助。