konversi gambar python pil ke bidang gambar Django

Saya mengunggah gambar, mengunggah gambar dan menyimpannya dalam model Django berfungsi dengan baik. Membuat thumbnail dan menyimpannya ke temp. lokasi juga berfungsi. Bagian yang tidak berfungsi adalah menyimpan thumbnail, file dibuat dan disimpan tetapi file kosong. :/ Bagaimana cara memperbaiki masalah data yang hilang.

Jika seseorang tahu cara mengonversi gambar pil ke model Django - imagefield tanpa menyimpan tmp ... tolong beri tahu.

def ajax_upload(request):
    if request.method == 'POST':
        newfile = Image()
        newfile.user = request.user
        file_content = ContentFile(request.raw_post_data)
        file_name = request.GET.get('file')

        newfile.image.save(file_name, file_content)

        # thumbnail creation ==========================================
        path = os.path.join(settings.MEDIA_ROOT, newfile.image.url)
        thumb_image = pil_image.open(path)

        # ImageOps compatible mode
        if thumb_image.mode not in ("L", "RGB"):
            thumb_image = thumb_image.convert("RGB")

        thumb_image_fit = ImageOps.fit(thumb_image, (32, 32), pil_image.ANTIALIAS)

        #saving temp file
        tmp_file_path = os.path.join(settings.MEDIA_ROOT, 'tmp_thumbnail.jpg')
        thumb_image_fit.save(tmp_file_path, 'JPEG', quality=75)

        #opening the tmp file and save it to django model
        thumb_file_data = open(tmp_file_path)
        thumb_file = File(thumb_file_data)

        newfile.thumbnail.save(file_name, thumb_file)
        #===============================================================

        results = {'url': newfile.image.url, 'id': newfile.id, 'width': newfile.image.width, 'height': newfile.image.height}
        return HttpResponse(json.dumps(results))
    raise Http404

person Aleksandrenko    schedule 17.04.2012    source sumber


Jawaban (1)


Anda dapat menyimpan file dan menetapkan jalurnya (relatif terhadap MEDIA_ROOT) ke bidang tujuan secara manual.

thumb_path = 'uploads/1_small.jpg'
thumb_image_fit.save(os.path.join(MEDIA_ROOT, thumb_path), 'JPEG', quality=75)
newfile.thumbnail = thumb_path

Tentunya Anda harus melakukan semua hal Django secara manual - periksa apakah berkasnya ada, ubah nama jika ada, dan seterusnya.

person ilvar    schedule 18.04.2012
comment
Saya tidak dapat mengujinya sekarang tetapi newfile.thumbnail adalah ImageField dan menurut saya 'newfile.thumbnail = thumb_path' tidak akan berfungsi. Jika saya melakukannya dengan benar, bidang gambar disimpan seperti ini: newfile.thumbnail.save(file_name, thumb_file) (nama_file adalah string dan thumb_file harus berupa File atau ContentFile) - person Aleksandrenko; 18.04.2012
comment
Ya, obj.field.save(name, content) adalah cara yang lebih benar dan didokumentasikan secara resmi. Tapi FileField hanya menyimpan jalur dalam database dan mengizinkan penetapan jalur itu secara langsung. Ini adalah fitur yang tidak terdokumentasi, tetapi berfungsi. - person ilvar; 19.04.2012
comment
Terima kasih, aku akan mengingatnya untuk masa depan. - person Aleksandrenko; 19.04.2012