1. 程式人生 > >Django框架(十五:表單中圖片的上傳)

Django框架(十五:表單中圖片的上傳)

圖片的上傳,就是後臺獲取表單傳過來的圖片並儲存。需要實現兩部分,一部分是將圖片的路徑儲存到資料庫,另一部分是把圖片檔案上傳到後臺。 下面來執行具體的操作:

  1. 由於上傳圖片時預設儲存在根目錄下的,所以需在settings.py檔案中配置圖片上傳的路徑 在這裡插入圖片描述
  2. 定義一個Model類,在Model中宣告一個用於儲存圖片地址的欄位,放在資料庫的表中;(此處不再展示程式碼)
  3. 在html檔案中新增上傳圖片的表單。input的type值必須為file
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>圖片上傳</title>
    </head>
    <body>
        <form action="/upload/" method="post" enctype="multipart/form-data">
            {# application/x-www-form-urlencoded:  username='123'&password='456' 適合文字 #}
            {# multipart/form-data: 以指定的分隔符對上傳資料進行分割 適合二進位制檔案 #}
            {# 上傳圖片相當於上傳資料,一定要使用POST請求,並且要指定一個屬性enctype #}
            {% csrf_token %}
            <input type="file" name="picture">
            <button type="submit">上傳</button>
        </form>
        <img src="/static/media/{{ img.pic_url }}" alt="">
    </body>
</html>
  1. 路由就自己配置了,接下來在views.py檔案中程式碼實現,具體的作用,已經註釋
def uploadimg(request):
    if request.method == 'GET':
        # img = PictureModel.objects.get(id=18)
        # return render(request, 'index.html', {'img': img})

        return render(request, 'index.html')
    else:
        # 需要從表單input中,獲取上傳的檔案物件(圖片)
        pic = request.FILES.get('picture')

        # 1. 建立Model物件,儲存圖片路徑到資料庫
        model = PictureModel()
        model.pic_url = pic.name
        model.save()

        # 2. 開始處理圖片,將圖片寫入到指定目錄。(/static/media/images/)
        # 拼接圖片路徑
        url = settings.MEDIA_ROOT + 'images/' + pic.name
        with open(url, 'wb') as f:
            # pic.chunks()迴圈讀取圖片內容,每次只從本地磁碟讀取一部分圖片內容,載入到記憶體中,並將這一部分內容寫入到目錄下,寫完以後,記憶體清空;下一次再從本地磁碟讀取一部分資料放入記憶體。就是為了節省記憶體空間。
            for data in pic.chunks():
                f.write(data)

        return HttpResponse('圖片上傳成功')