3

我需要防止上传文件名称中出现任何非 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 方法我说“保存并继续编辑”。

4

1 回答 1

1

据我所知,最好的方法是使用自定义上传处理程序,如果文件名无效,则跳过文件数据的实际上传。然后,您仍然会使用该clean_<filefieldname>方法来引发验证错误。

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

于 2012-08-24T11:00:57.983 回答