Symfony2 限制最终用户仅上传 csv 文件

Posted

技术标签:

【中文标题】Symfony2 限制最终用户仅上传 csv 文件【英文标题】:Symfony2 Restrict end user to upload only csv file 【发布时间】:2014-10-19 11:05:13 【问题描述】:

在我的 symfony2 应用程序中,我正在使用学说,我希望用户只上传 csv 文件。

以下是我在实体文件中设置的验证代码:

use Symfony\Component\Validator\Constraints as Assert;

/**
 * @var string
 * @Assert\File( maxSize = "1024k", mimeTypes = "text/csv", mimeTypesMessage = "Please   upload a valid CSV File")
 * @ORM\Column(name="filename", type="string", length=255)
 */
private $filename;

但它仍然不允许我上传 csv 文件。

【问题讨论】:

我认为这没有任何问题。当您删除 mimeTypes 条件时,上传正在进行? @Debflav,是的,如果我删除该条件,那么它对我有用。 也许可以尝试删除条件并检查您正在上传的文件的MimeTypes 试试这条消息:"文件的 mime 类型无效 ( type )。允许的 mime 类型是 types " @ra_htial,在此处发布问题之前已经这样做了。它向我展示了 text/csv 本身。即它是一个有效的文件。我在控制器操作中使用以下代码检查了它: [code] \Doctrine\Common\Util\Debug::dump($csvLoader->getFilename()->getClientMimeType()) 【参考方案1】:

根据您的评论:“文件的 mime 类型无效(“text/plain”)。允许的 mime 类型为“text/csv”。 p>

经过一番搜索,Symfony 2 正在使用finfo() 函数。你可以阅读php doesn't return the correct mime type:

Pekka 웃: “我对 fileinfo 的工作原理并不十分熟悉,但我认为这是正常的。文本文件(这就是 CSS 和 JS 的本质)没有提供关于它包含哪些内容的明确指示. 它们没有标头字节,没有定义的结构。所以所有糟糕的文件信息都可以做的就是猜测——结果很糟糕,正如你所看到的。

我认为要成功验证 .js 和 .css 文件的内容,您必须依赖扩展名,或者使用正确、适当的解析器实际解析它们。”

所以这不是错误,唯一的方法是实现您自己的逻辑(在您的 FormBuilder 中)或者像 tutty 所说的那样,您可以创建自定义约束。

编辑

根据您的评论,这里是使用 Symfony 2 finfo() 的地方: Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php

【讨论】:

能否分享一下你发现 Symfony2 使用 finfo() 的链接。 好的,谢谢。根据参考资料,目前让我们认为这是一个正确的解决方案。【参考方案2】:

发生这种情况是因为您的文件具有另一种 mime 类型(可能是 text/plain)。您应该验证文件内容。您可以在此处阅读有关自定义验证器的更多信息:http://symfony.com/doc/current/cookbook/validation/custom_constraint.html

【讨论】:

我也认为问题可能是 mime 类型,但 OP 已经检查过了。顺便说一句,这不是我的反对意见。 @Debflav,@Debflav,如果我将使用自定义约束来执行此操作,那么它将起作用。但我想让它在不使用自定义约束的情况下工作。我不明白为什么我的文件的 mime 类型是 text/plain 尽管我正在尝试上传 csv 文件,即使我使用以下代码检查控制器中的 mime 类型:\Doctrine\Common\Util\Debug::dump($csvLoader->getFilename()->getClientMimeType()); @KrishDamani 有时会向应用返回错误的 mime 类型。如果是这种情况,一种方法是使用自定义约束。但是你已经检查过了,它是'text/csv'。 @Debflav,是的,如上所述,在我的控制器操作\Doctrine\Common\Util\Debug::dump($csvLoader->getFilename()->getClientMimeType(‌​)); 中使用这行代码时,它向我显示了 text/csv。在错误消息中,它向我显示以下文本:The mime type of the file is invalid ("text/plain"). Allowed mime types are "text/csv"

以上是关于Symfony2 限制最终用户仅上传 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

Dropzone 在对话框中仅显示 CSV 和 XLS 文件

php导出csv文件大小怎么去除限制

如何使用 HTML5 使用模式属性验证仅 CSV 文件上传?

仅上传文档文件

仅增加一个 PHP 页面的 Max_input_vars 限制

Symfony2 - 为用户和类别使用控制器安全性