如何解决分块上传验证:“文件无法上传”
我目前正在尝试让 Symfonys Validator 组件处理上传文件的验证,这对于普通文件来说非常好。但是,如果文件超过特定大小,它们将作为块上传,然后合并并验证。两种上传方式都是通过同一个函数验证的,基本上就是这样的:
public function validateFile(UploadedFile $uploadedFile): ConstraintViolationList {
return $this->validator->validate(
$uploadedFile,[
new FileConstraints([
'maxSize' => '1000M',]),]
);
}
但不知何故,合并的上传触发了违规行为,不幸的是,这对我来说毫无意义:
Symfony\Component\Validator\ConstraintViolation {#658 ▼
-message: "The file Could not be uploaded."
-messageTemplate: "The file Could not be uploaded."
-parameters: []
-plural: null
-root: Symfony\Component\HttpFoundation\File\UploadedFile {#647 ▶}
-propertyPath: ""
-invalidValue: Symfony\Component\HttpFoundation\File\UploadedFile {#647 ▶}
-constraint: Symfony\Component\Validator\Constraints\File {#649 ▶}
-code: "0"
-cause: null
}
日志是干净的,没有错误,只有关于匹配路由和弃用内容的信息以及关于身份验证令牌等的调试。
如果我转储了 Uploadedobjects,唯一的区别是分块和合并的对象具有 executable: true
并且它没有存储在 tmp 中。
这里有人可以向我解释是什么导致了这种违规行为以及必须采取哪些措施来防止这种违规行为,或者向我指出一些与此相关的文档吗?
编辑:块的上传和合并似乎工作得很好 - 可以查看上传的图像,可以阅读文本文档/pdfs 等。现在还使用了所有其他代码一段时间,并进行了不同的验证,只是想要通过使用现有的 Validator 基础设施,让一切变得更加专业和排序。要提供有关上传对象的其他信息,这里是 dd 输出,从常规文件上传开始:
Symfony\Component\HttpFoundation\File\UploadedFile {#20 ▼
-test: false
-originalName: "foo.jpg"
-mimeType: "image/jpeg"
-error: 0
path: "/tmp"
filename: "PHPEu7Xmw"
basename: "PHPEu7Xmw"
pathname: "/tmp/PHPEu7Xmw"
extension: ""
realPath: "/tmp/PHPEu7Xmw"
aTime: 2021-05-27 10:47:56
mTime: 2021-05-27 10:47:54
cTime: 2021-05-27 10:47:54
inode: 1048589
size: 539474
perms: 0100600
owner: 1000
group: 1000
type: "file"
writable: true
readable: true
executable: false
file: true
dir: false
link: false
}
对于分块上传:
Symfony\Component\HttpFoundation\File\UploadedFile {#647 ▼
-test: false
-originalName: "foo.jpg"
-mimeType: "image/jpeg"
-error: 0
path: "/home/vagrant/MyProject/var/uploads"
filename: "foo.jpg"
basename: "foo.jpg"
pathname: "/home/vagrant/MyProject/var/uploads/foo.jpg"
extension: "jpg"
realPath: "/home/vagrant/MyProject/var/uploads/foo.jpg"
aTime: 2021-05-27 10:43:58
mTime: 2021-05-27 10:43:58
cTime: 2021-05-27 10:43:58
inode: 8154
size: 539474
perms: 0100777
owner: 1000
group: 1000
type: "file"
writable: true
readable: true
executable: true
file: true
dir: false
link: false
}
解决方法
new Count([
'min' => 1,'minMessage' => 'Please select a file to upload'
]),
我认为 NotBlank
约束是这里的问题,我认为它不应该用于 UploadedFile
。
尝试仅使用 File
和 Count
约束(以确保至少附加 1 个文件)。
当 File
约束接收到 UploadedFile
实例时,它会触发对 isValid
的调用,后者又会调用 is_uploaded_file
:
如果以 filename 命名的文件是通过 HTTP POST 上传的,则返回 true。 这有助于确保恶意用户没有尝试 欺骗脚本处理不应该处理的文件 工作
将块重新组合成新文件后,此检查不再通过并且约束失败。
您可以使用最后一个文件片段重新组合原始文件,也可以从您的函数中返回一个 File
。 File
不受该检查的约束,约束将与 UploadedFile
一起接受它。
以编程方式创建 UploadedFile 对象时,请使用“测试模式”。我将它与 VichUploaderBundle 一起使用,并且记录了测试模式的使用 here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。