为什么request.FILES [“ file”]。open()为None,尽管request.FILES。[“ file”]。name可以正常工作?

时间:2019-08-19 00:35:29

标签: python django ajax forms python-requests

我正在尝试使用Ajax将图像文件导入Django views.py。 我可以打印文件名和大小。但是当我打开文件时,它变成None ..!

我尝试打开图像的原因是将其用于视觉分析。 目前,我正在开发Django 1.11,python 3.6.7。

这是一些代码。

views.py

def receipt_ocr(request):
    if request.method == 'POST':
        print(type(request.FILES["file"]))              #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        print(request.FILES["file"])                    #bank.png
        print(request.FILES["file"].size)               #119227
        print(request.FILES["file"].name)               #bank.png
        print(request.FILES["file"].content_type)       #image/png
        print(type(request.FILES["file"].open()))       #<class 'NoneType'>
        print(request.FILES["file"].open())             #None
        print(type(request.FILES["file"].read()))       #<class 'bytes'>
        imageFile = request.FILES["file"]
        receipt_image = imageFile.read()
        print(type(receipt_image))                      #<class 'bytes'>
        print(receipt_image)                            #b''

html中的ajax部分

                $.ajax({
                    url: "{% url 'ocr:receipt_ocr' %}",
                    enctype: 'multipart/form-data',
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    data: postData,
                    complete: function(req){
                        alert('good');
                    },
                    error: function(req, err){
                        alert('message:' + err);
                    }
                });

我希望views.py中的receive_image是图像文件的二进制文件。但它是空的。因为request.FILES [“ file”]为None。我不知道为什么它没有。

感谢您阅读我的问题。 希望你有美好的一天?

1 个答案:

答案 0 :(得分:0)

在文件上调用read()后,后续调用将不会产生任何数据。第一次调用read()会读取整个缓冲区,而再次调用时将没有任何内容

    print(type(request.FILES["file"].read())) # This line has read the entire buffer
    imageFile = request.FILES["file"]
    receipt_image = imageFile.read() # There is nothing left to read so this returns b''