ほんじゃらねっと

ダイエット中プログラマのブログ

Djangoでアップロードした画像ファイルのサイズを変更して保存する

前回の続き。アップロードがうまくいったので、
Ruby on Railsfilecolumnプラグインみたいにいくつかのサイズに分けて画像を保存する処理を書いてみる。

色んな言語やフレームワークを触ってみると応用できて良い。
特にRubyPythonを両方知っておけば相互に参考になりそう。


DjangoではPhotoFieldのresizeメソッドで自在にサイズを変更できるようだ。


重なってる処理やら何やらあるけど、とりあえず動く。
ミドルサイズとサムネイルサイズの画像を保存する。


models.py

from django.db import models
from django.conf import settings
from verdjnlib.fields import PhotoField, FIT
import os
class Photo(models.Model):
filecode = models.CharField("ファイル名", maxlength=100, blank=True)
extention = models.CharField("拡張子", maxlength=100, blank=True)
image = PhotoField("写真", upload_to='photos', height=1024, width=1024)
def save_thumbnail(self, filename, image):
thumb = PhotoField.resize(image, 75, 75, FIT)
directory = os.path.join(settings.MEDIA_ROOT, "photos")
try:
os.makedirs(directory)
except OSError:
pass
filepath = os.path.join(directory, filename)
fp = open(filepath, "wb")
fp.write(thumb)
fp.close()
def get_thumbnail_filename(self):
return self.filecode + "_tb" + self.extention
def save_middlesize(self, filename, image):
middle = PhotoField.resize(image, 500, 500, FIT)
directory = os.path.join(settings.MEDIA_ROOT, "photos")
try:
os.makedirs(directory)
except OSError:
pass
filepath = os.path.join(directory, filename)
fp = open(filepath, "wb")
fp.write(middle)
fp.close()
def get_middlesize_filename(self):
return self.filecode + "_md" + self.extention


views.py

...
# 画像アップロード処理
def picture_upload(request):
if request.method == "POST":
post_data = request.POST
post_data.update(request.FILES)
photo = Photo()
photo.user = request.user
image_file = post_data["image_file"]
if image_file:
filename = image_file["filename"]
filecode = CodeManager().next('Photo')
m = re.search(r"(?P<ext>\.[a-zA-Z]+)$", filename)
ext = m.group("ext")
photo.filecode = filecode
photo.extention = ext
photo.image = filecode + ext
photo.title = filename
photo.save_image_file(filecode + ext, PhotoField.resize(image_file["content"], 1024, 1024, FIT))
photo.save_thumbnail(filecode + "_tb" + ext, image_file["content"])
photo.save_middlesize(filecode + "_md" + ext, image_file["content"])
photo.save()
message = "アップロードを完了しました"
else:
message = "アップロードに失敗しました"
else:
message = "アップロードに失敗しました"
...


後で直す。