如何利用Django上传文件,并且保存到数据库

Django是一个由Python写成的Web应用框架。Django的主要目的是简便、快速的开发数据库驱动的网站。下面我们来介绍如何利用Django上传本地文件到服务器,并且保存到Mysql数据库

1、使用数据库

保存文件到数据库,需要Django操作数据库,如果你没有用过Django操作数据库,请移步我的博客教程:Django如何使用Mysql数据库

2、前端代码

在templates目录下创建一个test.html文件,并且向其加入下面的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>文件上传</title>
    <!-- Meta Tags -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="utf-8">
    <meta name="keywords" content="" />
 </head>   
    <body>
        <form action="/upload" method="POST" enctype="multipart/form-data">   
            {% csrf_token %}
            <input type="file" name="file" >
            <input type="submit" name="submit" value="上传">
        </form>
    {% if img_obj %}
        <img src="{{ img_obj.img.url }}">
    {% endif %}
    </body>

</html>

3、后端配置

在settings.py中增加下面的配置,这个配置主要用于图片和媒体文件保存的目录和路由,也就是说,你访问http://ip/media/xxx/xxx.jpg  就能直接访问到MEDIA_ROOT目录下对应子目录的文件,数据库图片也是默认保存在MEDIA_ROOT及其子目录下

# 设置MEDIA
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'media')

注意:在你的工程目录下需要手动新建一个media目录,该目录和tempaltes同级

设置路由,目的是实现其访问对应关系,在urls.py中添加配置,并且处理文件上传的视图函数

# coding:utf-8
from django.contrib import admin
from django.conf import settings
from django.views.static import serve
from django.urls import path
from django.urls import re_path

from . import view

urlpatterns = [
    path('admin/', admin.site.urls),
    path('upload', view.upload_handle),  # 处理文件POST请求
    path('test/', view.test), # 上传文件界面
    re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}), # 实现路由对应关系
]

在模型文件配置数据库,即在models.py中配置如下代码:

from django.db import models

# Create your models here.
class Image(models.Model):
    # 上传的图片将保存在/media/img 的目录下 这样我们才可以通过http://ip/media/xxx.jpg 访问我们的图片
    img = models.ImageField(upload_to="img/" , verbose_name="图片")

更新数据库:

python manage.py makemigrations
python manage.py migrate

4、后端代码处理

在view.py中添加下面的处理视图函数:

from django.shortcuts import render
from app.models import Image  # 这里的app名,根据自己的名字而定

def upload_handle(request):
    # 判断是否是有效的POST请求
    if request.method == 'POST' and request.POST:
        # 获取文件对象
        file = request.FILES.get('file', None)
        if file is None:
            raise NameError("提交表单为空")
        # 创建一个表,这里表中只有一个字段
        img = Image.objects.create(img=file)
        # 返回响应,把图片在html中显示
        return render(request, 'test.html', {
            "img_obj" : img
        })

def test(request):
    return render(request, 'test.html', {})

5、测试

程序运行:

python manage.py  runserver 0.0.0.0:8000

在浏览器中访问:http://ip:8000/test/



服务器上传路径:

0

Leave a Reply

Your email address will not be published.