Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
上传前在django中验证文件名_Django - Fatal编程技术网

上传前在django中验证文件名

上传前在django中验证文件名,django,Django,我需要防止上传文件名中出现任何非ASCII字符,因为使用数据的应用程序无法处理它们。我想显示一个简单的验证错误 通常,我在我的模型表单上使用clean方法来执行此操作。它可以工作,但问题是在上传文件后调用它(这很有意义,因为我可能想检查文件数据等) 但是,在本例中,我不需要实际的文件数据,只需要名称,并且希望在上传任何内容之前对其进行验证。我在哪里可以做到这一点(除了修改我的所有管理模板以进行客户端JS检查) 编辑: 按照Ghopper21的回答,我编写了这个上载处理程序(并将其添加到setti

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

通常,我在我的模型表单上使用
clean
方法来执行此操作。它可以工作,但问题是在上传文件后调用它(这很有意义,因为我可能想检查文件数据等)

但是,在本例中,我不需要实际的文件数据,只需要名称,并且希望在上传任何内容之前对其进行验证。我在哪里可以做到这一点(除了修改我的所有管理模板以进行客户端JS检查)

编辑:

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

如果名称不正确,则validate_字符串将引发ValidationError。但是,无论文件名是否有效,POST请求都会超时。除了django页面上的UploadHandler文档,我找不到其他更详细的示例


如果我使用StopUpload而不是StopFutureHandlers,我会得到正确文件的相同行为,但实际上不会上载无效文件-但随后我会重定向到模型的列表视图,而不会看到验证错误,即使实现了clean方法,并且我说“保存并继续编辑”.

据我所知,最好的方法是使用一个在文件名无效时跳过实际上传文件数据的方法。然后您仍然可以使用
clean.
方法来引发验证错误


要在两个地方检查文件名有点烦人。但无论如何,你都不能在表单中完成这一切,因为Django会在你访问
HttpRequest
objects的
POST
file
属性时上传文件数据,这些属性是你在创建绑定表单时传入的。

为什么不修复“使用数据的应用程序无法处理它们?”?因为这些应用程序不是由我开发的,而我的修复工作量估计要低一些。@jpic刚刚让一个用户上传了一个文件名中带有星号的文件(在非Django应用程序中)。可以想象,编写的许多代码都假设文件名中没有使用星号——或者,如果使用星号,那是因为您希望它扩展。所以有时候你只需要过滤掉字符,让事情变得更简单,而不是重写每个应用程序来处理各种输入。
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