Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          找到兩篇相關帖子,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中圖片上傳的2種處理方式

          關鍵字: django 上傳圖片 pil

              首先申明該文使用的django 版本為svn 版本,我每天都在更新python 是2.5,pil 也是最新的版本。

              通常情況下用django上傳圖片我們會定義一個django.forms.Form的子類,比如:

          Python代碼 復制代碼
          1. # coding: utf-8  
          2.   
          3. import django.forms as forms  
          4.   
          5. class PictureForm(forms.Form):   
          6.     # ......     
          7.     # 圖片  
          8.     imagefile = forms.ImageField()  
          9.     # ......  

               然后我們在服務端會定義一個函數來處理圖片上傳,我們先來看看一般的做法:

          Python代碼 復制代碼
          1. # coding: utf-8  
          2.   
          3. from django.http import HttpResponse  
          4.   
          5. def addPicture(request):  
          6.     if request.method == 'POST':  
          7.         form = PictureForm(request.POST, request.FILES)  
          8.         if form.is_valid():  
          9.             f = request.FILES["imagefile"]  
          10.             # des_origin_path 為你在服務器上保存原始圖片的文件物理路徑  
          11.             des_origin_f = open(des_origin_path, "ab")  
          12.             for chunk in f.chunks():  
          13.                 des_origin_f.write(chunk)  
          14.             des_origin_f.close()  
          15.               
          16.             # 圖片文件被保存在硬盤上后,你可以用pil的Image.open打開進行處理,比如改變大小,加水印等等  

               在上面這種傳統的做法中,是把圖片文件保存到硬盤上后,再由pil圖形庫從硬盤上加載,再進行圖片處理,明顯多了很多的硬盤IO操作,如果你是一個圖片處理量很大的應用,顯然不想看到這樣的局面。那我們來看看另外一個做法:

          Python代碼 復制代碼
          1. # coding: utf-8  
          2.   
          3. from django.http import HttpResponse  
          4. import ImageFile  
          5.   
          6. def addPicture(request):  
          7.     if request.method == 'POST':  
          8.         form = PictureForm(request.POST, request.FILES)  
          9.         if form.is_valid():  
          10.             f = request.FILES["imagefile"]  
          11.             parser = ImageFile.Parser()  
          12.             for chunk in f.chunks():  
          13.                 parser.feed(chunk)  
          14.             img = parser.close()  
          15.             # 在img被保存之前,可以進行圖片的各種操作,在各種操作完成后,在進行一次寫操作  
          16.             img.save("yoursavepath")  

               在上面的做法中,我們利用pil的ImageFile直接從django接收的數據流中構建出圖形對象,進行處理后,在保存,減少了硬盤的讀操作。現在網 上有些例子使用StringIO對象來作為pil Image.open的輸入,經過我多次嘗試,在ubuntu以及winxp、centos上都要報異常,我想可能跟pil的版本有關,或許以前的低版本 pil的確可以處理。



          posted on 2008-09-24 23:11 seal 閱讀(8275) 評論(0)  編輯  收藏 所屬分類: Python
          主站蜘蛛池模板: 彭州市| 榆中县| 河源市| 高阳县| 沙洋县| 长治市| 梁山县| 绿春县| 漳州市| 南平市| 丹寨县| 温宿县| 永济市| 樟树市| 景德镇市| 那坡县| 许昌县| 雷波县| 湘潭市| 含山县| 来安县| 建平县| 波密县| 钟祥市| 澜沧| 蕉岭县| 巩义市| 万荣县| 防城港市| 洞头县| 彭山县| 清原| 潜江市| 阿拉善盟| 上蔡县| 琼结县| 长治市| 锡林浩特市| 石柱| 乌拉特前旗| 博爱县|