-2

我有以下代码在我处理的 Django 项目中为我处理图像上传:

def upload_handler(source):
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=MEDIA_ROOT)
    with open(filepath, 'wb') as dest:
        shutil.copyfileobj(source, dest)
        return MEDIA_URL + basename(dest.name)

上传部分一切正常,但 mkstemp 在扩展后使用额外的 6 个随机后缀保存我的图像(例如 test.png -> test.pngbFVeyh)。即使我在第二个代码行中传递后缀,它也会附加它,但也会附加 6 个随机字符。正在发生的其他奇怪的事情是,在上传文件夹(在我的情况下为 MEDIA_ROOT)中,它与另一个与图片同名的空纯文本文档类型文件(例如 test.pngbFVeyh)一起创建。我已阅读有关 mkstemp 的文档,但没有找到任何替代解决方案。

4

2 回答 2

2
def upload_handler(source):
    # this is creating a temp file and returning an os handle and name
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=MEDIA_ROOT)
    # this next line just clears the file you just made (which is already empty)
    with open(filepath, 'wb') as dest: 
        # this is a strange way to get a fobj to copy :)
        shutil.copyfileobj(source, dest)
        return MEDIA_URL + basename(dest.name)

prefix 和 suffix 就是这样做的,因此如果您不希望文件名以临时字符开头或结尾,则需要同时使用前缀后缀。例如,

name = os.path.basename(source.name)
prefix, suffix = os.path.splitext(name)
_, filepath = tempfile.mkstemp(prefix=prefix, suffix=suffix, dir=MEDIA_ROOT)

但如果您使用 会更好tempfile.NamedTemporaryFile,因为这样会返回类似文件的对象(因此您不必从文件名创建 fobj 并且在完成后默认删除临时文件)。

fobj, _ = tempfile.NamedTemporaryFile(prefix=prefix, suffix=suffix, dir=MEDIA_ROOT)
shutil.copyfileobj(source, fobj)
于 2017-08-10T23:42:12.440 回答
-1

该名称是随机生成的,因为它是tempfile.mkstemp. 创建具有该名称的文件是因为它是这样tempfile.mkstemp工作的。它也被打开,文件描述符返回给您,您在fd其中忽略。您似乎不明白tempfile.mkstemp应该如何使用,您可能需要使用其他东西。

于 2013-03-18T11:48:19.600 回答