我正在使用yii \ web \ UploadedFile按照文档上传excel和csv文件。上传工作完全正常但是,我遇到了一些奇怪的问题,我无法弄清楚如何修复。
我已经明确规定允许xls,xlsx和csv。 --->上传xls和xlsx没有任何问题,但csv文件抛出“只允许带有这些扩展名的文件:xlsx,xls和csv。”错误。我100%确定我正在上传csv文件。 这种情况有什么特别的原因吗?怎么修好? 现在,我已经通过删除规则的扩展并在扩展名不是xls,xlsx或csv时显示带有错误消息的解决方法,但如果我可以使用规则中的默认值,我会更喜欢它。
我主要使用日文文件名的文件。即:テスト0001.xlsx和テスト0001.csv。当我尝试回显或转储在yii上生成的文件名时,我得到了正确的文件名但是当我检查uploads文件夹时,文件名变为类似:陬ス蜩√.xlsx。 到目前为止,我已经尝试使用iconv将字符集设置为UTF8而没有运气。我也试过硬编码文件名只是为了检查它是否与实际文件有关,但结果仍然相同。如何在上传文件时保留原始文件名?
答案 0 :(得分:4)
广告。 1.这是因为checkExtensionByMimeType
中有FileValidator
个选项。默认设置为true
,它验证文件扩展名是否与文件MIME类型匹配。对于csv
个文件,MIME通常为text/plain
,这会导致验证错误。
解决方案是将checkExtensionByMimeType
设置为false
以进行此类文件上传。
广告。你在用什么版本的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/
希望这会有所帮助。