前回の続き。アップロードがうまくいったので、
Ruby on Railsのfilecolumnプラグインみたいにいくつかのサイズに分けて画像を保存する処理を書いてみる。
色んな言語やフレームワークを触ってみると応用できて良い。
特にRubyとPythonを両方知っておけば相互に参考になりそう。
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 = "アップロードに失敗しました" ...
後で直す。