我需要防止上传文件名称中出现任何非 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,对于正确的文件,我会得到相同的行为,但实际上不会上传无效文件 - 但是我被重定向到模型的列表视图而不是看到验证错误,即使实现了 clean 方法我说“保存并继续编辑”。