Django 从文件名中删除“@”和其他特殊字符

如何解决Django 从文件名中删除“@”和其他特殊字符

我想上传一个文件名作为上传者电子邮件文件。我知道这不是操作系统文件系统问题,也不是不受支持的 python 操作,因为我确实在 python 中保存了这种格式的图像。现在我想将图像保存在模型中(特别是 ImageField)。

如果存在一些同名的现有图像,我将使用 OverwriteStorage 覆盖图像。

保存图片

model = Model.objects.create(email=email)
# Blob to image
tempfile_io = io.BytesIO()
img.save(tempfile_io,'JPEG')
image_file = InMemoryUploadedFile(tempfile_io,None,email + ".jpeg",'image/jpeg',tempfile_io.getbuffer().nbytes,None)
print("email is",email)
model.pic.save(email + ".jpg",image_file)

模型

class Model(models.Model):
    email = models.EmailField()
    pic = models.ImageField(upload_to="pics",storage=OverwriteStorage())

覆盖存储

class OverwriteStorage(FileSystemStorage):
    def get_available_name(self,name,*args,**kwargs):
        print("name is",name)
        if self.exists(name):
            self.delete(name)
        return name

但由于某种原因,我在 OverwriteStorage-get_available_name 中没有得到确切的名称

email is xyz@example.com
name is xyzexamle.com.jpg

请注意@ 符号是如何被粗暴删除的。 是否有任何文件名字符串检查我需要禁用。如何让 Django 使用给定的确切文件名(尽可能)?

解决方法

您必须将 get_valid_name(name) 覆盖为 documented

get_valid_name(name)

返回适合与底层存储一起使用的文件名 系统。传递给此方法的名称参数要么是原始的 发送到服务器的文件名,或者,如果 upload_to 是可调用的,则 任何路径信息后该方法返回的文件名 移除。覆盖它以自定义非标准字符的方式 转换为安全文件名。

来自source

def get_valid_name(self,name):
    """
    Return a filename,based on the provided filename,that's suitable for
    use in the target storage system.
    """
    return get_valid_filename(name)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?