Python Flask将图像上载到S3-覆盖任意位置的随机文件名

Python Flask将图像上载到S3-覆盖任意位置的随机文件名,python,flask,Python,Flask,我现在面临一个奇怪的问题,我正确生成的文件名被一些随机的东西覆盖了 我正在使用此代码上传到AWS3,在这里,代码检查bucket中是否已经存在具有此名称的文件,如果存在,则在文件末尾添加1,然后继续检查现有文件并递增数字,直到文件名唯一 我在一个单独的python文件中测试了代码,它似乎工作得很好,但在这里,我的文件名被随机stringname b1.a覆盖 我现在调试了一段时间,但我没有任何线索。我记得不久前有过类似的事情,一个失踪的favicon导致了这个问题,可能有人知道发生了什么,以及这

我现在面临一个奇怪的问题,我正确生成的文件名被一些随机的东西覆盖了

我正在使用此代码上传到AWS3,在这里,代码检查bucket中是否已经存在具有此名称的文件,如果存在,则在文件末尾添加1,然后继续检查现有文件并递增数字,直到文件名唯一

我在一个单独的python文件中测试了代码,它似乎工作得很好,但在这里,我的文件名被随机stringname b1.a覆盖

我现在调试了一段时间,但我没有任何线索。我记得不久前有过类似的事情,一个失踪的favicon导致了这个问题,可能有人知道发生了什么,以及这些问题是如何联系在一起的。但这一次我不知道发生了什么

k.key = bucketpath + filename_hauptbild
if k.key in bucket:
    new_filename_haupt_split = filename_hauptbild.split(".")
    while k.key in bucket:
        if new_filename_haupt_split[0][-1] not in "0123456789":
            new_filename_haupt = new_filename_haupt_split[0] + "1." + new_filename_haupt_split[1]
        else:
            new_filename_haupt = new_filename_haupt_split[0][:-1] + str(int(new_filename_haupt_split[0][-1]) + 1) + "." + new_filename_haupt_split[1]
        new_filename_haupt_split = new_filename_haupt
        k.key = bucketpath + new_filename_haupt
        print  "this", new_filename_haupt
    k.key = bucketpath + new_filename_haupt
    filename_hauptbild = new_filename_haupt
    k.set_contents_from_string(file_contents)
else:
    k.set_contents_from_string(file_contents)

print filename_hauptbild
setattr(model_to_change, model_column, filename_hauptbild)
请注意: 我使用了2张照片,输出显示了3行。 第一次打印此文件时,新的\u文件名\u haupt初始显示正确的文件名,但被b1覆盖。a:

控制台输出:

更新文件名时,未正确更新分割变量:

new_filename_haupt_split = new_filename_haupt
因此,在下一个循环中,当您调用new_filename_haupt_split[0]时,您只得到文件名的第一个字母-b-而不是文件名本身,当您调用new_filename_haupt_split[1]时,您得到的是第二个字母-a-而不是扩展名。因此命名为b1.a。将您的线路更改为:

new_filename_haupt_split = new_filename_haupt.split(".")
我认为这应该行得通

编辑:您可以将其作为一个函数重新编写,以使您的生活更加轻松。下面是一个您可能需要的方法示例:

bucket = ['baubedarf.png', 'baubedarf1.png']

def get_filename(input_filename, all_files):
    if input_filename in all_files:
        filename, ext = input_filename.rsplit('.', 1)
        counter = 1
        while '{}{}.{}'.format(filename, counter, ext) in all_files:
            counter += 1
        return '{}{}.{}'.format(filename, counter, ext)
    else:
        return input_filename

print get_filename('baubedarf.png', bucket)

我已经搞定了,而且已经修好了,真是个愚蠢的错误。谢谢你的时间@Roman如果可以的话,您可能想尝试将其作为函数重新编写—我已经在一个示例中编辑了它的工作原理