找到兩篇相關帖子,mark一下:
一。
首先在model上要有一個ImageFiled字段,
同時 模板上對應放一個<input type="file" name = "file">,
以下就是視圖的代碼了,
import Image
import StringIO
from datetime import datetime
def add_topic(request):
file_obj = request.FILES.get('file', None)
if file_obj:
data = file_obj['content']
f = StringIO.StringIO(data)
image = Image.open(f)
image = image.convert('RGB')
abs_name = '%s_%s_%s' %(str(request.user),"
str(datetime.today()).replace(':', '-')[:-7],"
file_obj['filename'])
image.save(file(abs_name, 'wb'))
return HttpResponseRedirect("/forum/forum/")
二。
關鍵字: django 上傳圖片 pil
首先申明該文使用的django
版本為svn
版本,我每天都在更新
,python
是2.5,pil
也是最新的版本。
通常情況下用django上傳圖片我們會定義一個django.forms.Form的子類,比如:
Python代碼

- # coding: utf-8
-
- import django.forms as forms
-
- class PictureForm(forms.Form):
- # ......
- # 圖片
- imagefile = forms.ImageField()
- # ......
# coding: utf-8
import django.forms as forms
class PictureForm(forms.Form):
# ......
# 圖片
imagefile = forms.ImageField()
# ......
然后我們在服務端會定義一個函數來處理圖片上傳,我們先來看看一般的做法:
Python代碼

- # coding: utf-8
-
- from django.http import HttpResponse
-
- def addPicture(request):
- if request.method == 'POST':
- form = PictureForm(request.POST, request.FILES)
- if form.is_valid():
- f = request.FILES["imagefile"]
- # des_origin_path 為你在服務器上保存原始圖片的文件物理路徑
- des_origin_f = open(des_origin_path, "ab")
- for chunk in f.chunks():
- des_origin_f.write(chunk)
- des_origin_f.close()
-
- # 圖片文件被保存在硬盤上后,你可以用pil的Image.open打開進行處理,比如改變大小,加水印等等
# coding: utf-8
from django.http import HttpResponse
def addPicture(request):
if request.method == 'POST':
form = PictureForm(request.POST, request.FILES)
if form.is_valid():
f = request.FILES["imagefile"]
# des_origin_path 為你在服務器上保存原始圖片的文件物理路徑
des_origin_f = open(des_origin_path, "ab")
for chunk in f.chunks():
des_origin_f.write(chunk)
des_origin_f.close()
# 圖片文件被保存在硬盤上后,你可以用pil的Image.open打開進行處理,比如改變大小,加水印等等
在上面這種傳統的做法中,是把圖片文件保存到硬盤上后,再由pil圖形庫從硬盤上加載,再進行圖片處理,明顯多了很多的硬盤IO操作,如果你是一個圖片處理量很大的應用,顯然不想看到這樣的局面。那我們來看看另外一個做法:
Python代碼

- # coding: utf-8
-
- from django.http import HttpResponse
- import ImageFile
-
- def addPicture(request):
- if request.method == 'POST':
- form = PictureForm(request.POST, request.FILES)
- if form.is_valid():
- f = request.FILES["imagefile"]
- parser = ImageFile.Parser()
- for chunk in f.chunks():
- parser.feed(chunk)
- img = parser.close()
- # 在img被保存之前,可以進行圖片的各種操作,在各種操作完成后,在進行一次寫操作
- img.save("yoursavepath")
# coding: utf-8
from django.http import HttpResponse
import ImageFile
def addPicture(request):
if request.method == 'POST':
form = PictureForm(request.POST, request.FILES)
if form.is_valid():
f = request.FILES["imagefile"]
parser = ImageFile.Parser()
for chunk in f.chunks():
parser.feed(chunk)
img = parser.close()
# 在img被保存之前,可以進行圖片的各種操作,在各種操作完成后,在進行一次寫操作
img.save("yoursavepath")
在上面的做法中,我們利用pil的ImageFile直接從django接收的數據流中構建出圖形對象,進行處理后,在保存,減少了硬盤的讀操作。現在網
上有些例子使用StringIO對象來作為pil
Image.open的輸入,經過我多次嘗試,在ubuntu以及winxp、centos上都要報異常,我想可能跟pil的版本有關,或許以前的低版本
pil的確可以處理。