gpt4 book ai didi

django - 上传前在 Django 中验证文件名

转载 作者:行者123 更新时间:2023-12-03 15:23:38 26 4
gpt4 key购买 nike

我需要防止上传文件名中出现任何非 ASCII 字符,因为使用这些数据的应用程序无法处理它们。我想显示一个简单的验证错误。

通常我在 clean_<filefieldname> 中这样做我的 ModelForm 上的方法。它有效,但问题是这是在文件上传后调用的(这是有道理的,因为我可能想检查文件数据等)。

然而,在这种情况下,我不需要实际的文件数据,只需要名称,并且想在上传任何内容之前对其进行验证。我在哪里可以执行此操作(除了修改我的所有管理模板以执行客户端 JS 检查之外)?

编辑:

根据 Ghopper21 的回答,我编写了这个上传处理程序(并将其添加到 settings.py 中列表的开头):

class CheckFilenameUploadHandler(FileUploadHandler):

def receive_data_chunk(self, raw_data, start):
return raw_data, start

def file_complete(self, file_size):
return None

def new_file(self, field_name, file_name, content_type, content_length, charset):
try:
validate_string(file_name)
except ValidationError:
raise StopFutureHandlers

如果名称不正确,validate_string 会引发 ValidationError。但是,无论文件名是否有效,这都会使我的 POST 请求超时。除了 Django 页面上的 UploadHandler 文档之外,我找不到任何更详细的示例。

如果我引发 StopUpload 而不是 StopFutureHandlers,我会得到正确文件的相同行为,但实际上不会上传无效文件 - 但随后我被重定向到模型的 ListView 而不是看到验证错误,即使干净方法已实现,我说“保存并继续编辑”。

最佳答案

据我所知,最好的方法是使用 custom upload handler如果文件名无效,则跳过文件数据的实际上传。然后你仍然会使用 clean_<filefieldname>方法来引发验证错误。

不得不在两个地方检查文件名有点烦人。但是无论如何,您不能在表单中完成所有操作,因为 Django 会在您访问 HttpRequest 时立即上传文件数据。对象的 POSTFILE属性,这是您在创建绑定(bind)表单时传入的内容。

关于django - 上传前在 Django 中验证文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12107208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com