Python和Django-如何在内存和临时文件中使用

use*_*631 2 python django django-file-upload

我需要一些在内存和临时文件中使用文件操作的示例。

我在一个很好的示例/ tutorial中进行了大量搜索,发现只是基本的读/写/追加操作。

我需要了解如何在Django中读取保存(发布)完成之前上传的文件(图像)。

因为Django是Python,所以我认为最好先了解python。

我检查了有关Django的文档/示例,但是并不太清楚,因此我需要首先在phyton中而不是在Django中了解操作的工作方式,而不仅仅是复制和粘贴。

我知道如何使用ImageFields,上载默认操作,我只对使用“内存和临时文件”感兴趣。

我想结合使用此功能和裁剪功能。因此用户可以上传1,2,3 ..图片,并使用javascript裁剪脚本在隐藏字段中获取坐标。在用javascript模拟裁剪后,我向用户显示了裁剪的缩略图,比例看起来如何

用户可以改变主意,可以在保存之前编辑/更新或删除文件。

现在,根据文件大小,它可以保留在内存中或写入。

min*_*zer 7

上载文件时,Django将执行以下两项操作之一:如果文件较小(将其存储为小于2 MB,则存储在内存中);如果文件较大,则将其作为临时文件存储在磁盘上。可通过FILE_UPLOAD_HANDLERS设置配置此行为。因此,您的Web服务器和Django负责实际的上载和存储,但是在请求结束之前处理文件是您的工作,否则文件将被删除。

可通过该request.FILES属性访问上载的文件。每个键入的内容FILES都会与您的输入文件的名称匹配<form>。该值是一个UploadedFile对象,它是可用于读取文件数据的流。

例如,假设您有一个,<input name="img" type="file" />并且想要检测图像是否完全为白色。您不需要为此存储文件,只需将其加载到内存中,对其进行处理以获取结果,然后将其丢弃。

from PIL import Image

def some_view(request):
    if request.method == 'POST':
        img_file = request.FILES['img']

        if img_file.size > 2000000:
            return HttpResponseBadRequest()

        img = Image.open(img_file)

        # analyze the image...
Run Code Online (Sandbox Code Playgroud)

另一种可能性是有人上传的备份文件很大(假设为2 GB),您需要将其存储在某个地方。实际上,这是同一件事,除了我们将文件分块读取到内存中,然后将每个块写入磁盘到其他地方,以便在请求完成后将其保存。

def some_view(request):
    if request.method == 'POST':
        backup_file = request.FILES['backup_file']
        with open('some/file/name.bak', 'wb+') as destination:
            for chunk in backup_file.chunks():
                destination.write(chunk)

        # file is saved
Run Code Online (Sandbox Code Playgroud)

请求结束后,上传的文件存储在some/file/name.bak

通常是不重要的,因为它是在内存中还是临时文件中,因为接口是相同的。您可以读取一个临时文件,就像您可以读取一个内存文件一样。