使用Django创建文件上传服务器

作者: Passon_Fang | 来源:发表于2016-12-17 11:49 被阅读4596次

    title: 使用 Django 创建一个文件上传的服务器
    date: 2016-12-17 13:18:12
    tags: [Django, FileUpload]
    category: Python


    django 版本:1.10.1
    python 版本:3.5.0

    创建工程:upload_demo

    django-admin startproject upload_demo
    

    运行工程:

    python3 manager.py runserver
    

    打开网站查看工程是否创建成功:

    http://127.0.0.1:8000/
    
    django-welcomedjango-welcome

    创建一个 app:upload_app

    python3 manager.py startapp upload_app
    

    在 'upload_demo/setting.py' 中注册 app:

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'upload_app.apps.UploadAppConfig' # +++
    ]
    

    建立文件上传的 url

    创建 View

    upload_app/views.py:

    def upload_file(request):
        """
        文件接收 view
        :param request: 请求
        :return:
        """
        if request.method == 'POST':
            pass
        else:
            pass
        return HttpResponse("Hello, world. Upload File.")
    

    创建 app 自己的 urls.py

    创建文件:upload_app/urls.py

    from django.conf.urls import url, include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^$', views.upload_file)
    ]
    

    注册 app 的 urls.py

    将 app 的 url 加入到 upload_demo/urls.py 中:

    from django.conf.urls import url, include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^upload/', include('upload_app.urls')) # +++
    ]
    

    访问网址:http://127.0.0.1:8000/upload/

    看到下面的图片,说明 url 建立成功。

    django_file_urldjango_file_url

    使用表单提交文件

    建立一个表单类

    upload_app/forms.py:

    from django.forms import forms
    
    
    class FileUploadForm(forms.Form):
        my_file = forms.FileField()
    

    引入模版

    建立文件夹 templates/

    创建一个 html:templates/upload_temp.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form action="/upload/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="提交"/>
    </form>
    
    
    </body>
    </html>
    

    upload_demo/settings.py 中声明这个模版:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    修改 view

    upload_app/views.py:

    from django.http import HttpResponse
    from django.shortcuts import render
    from upload_app.forms import FileUploadForm
    
    def upload_file(request):
        """
        文件接收 view
        :param request: 请求
        :return:
        """
        if request.method == 'POST':
            my_form = FileUploadForm(request.POST, request.FILES)
            if my_form.is_valid():
                f = my_form.cleaned_data['my_file']
                handle_uploaded_file(f)
            return HttpResponse('Upload Success')
        else:
            my_form = FileUploadForm()
        return render(request, 'upload_temp.html', {'form': my_form})
    
    
    def handle_uploaded_file(f):
        with open(f.name, 'wb+') as destination:
            for chunk in f.chunks():
                destination.write(chunk)
    

    打开网站:http://127.0.0.1:8000/upload/ 就可以上传文件了,上传的文件会在工程的根目录下。

    利用 Model 管理上传的文件

    创建 Model

    upload_app/models.py:

    from django.db import models
    
    class FileSimpleModel(models.Model):
        """
        文件接收 Model
        upload_to:表示文件保存位置
        """
        file_field = models.FileField(upload_to="upload/%Y/%m/%d")
    

    更新数据库

    创建或者修改了 model 都需要更新以下数据库:

    python3 manage.py makemigrations
    python3 manage.py migrate
    

    这里推荐使用 Navicat 查看数据库:

    django_file_dbdjango_file_db

    修改 views

    在 views 中使用 Model upload_app/views.py:

    from django.http import HttpResponse
    from django.shortcuts import render
    from upload_app.forms import FileUploadForm
    from upload_app.models import FileSimpleModel
    
    def upload_file(request):
        """
        文件接收 view
        :param request: 请求
        :return:
        """
        if request.method == 'POST':
            my_form = FileUploadForm(request.POST, request.FILES)
            if my_form.is_valid():
                # f = my_form.cleaned_data['my_file']
                # handle_uploaded_file(f)
                file_model = FileSimpleModel()
                file_model.file_field = my_form.cleaned_data['my_file']
                file_model.save()
            return HttpResponse('Upload Success')
        else:
            my_form = FileUploadForm()
        return render(request, 'upload_temp.html', {'form': my_form})
    

    下面就可以使用了

    上传一个文件后数据库变化: file_field 中保存的是文件的相对路径

    django_file_upload_dbdjango_file_upload_db

    相关文章

      网友评论

      • 哈喽jv:上传的文件路径和名字会不会重复? 怎么处理啊?
        哈喽jv:@Doming 嗯 感谢...
        Passon_Fang:@哈喽jv 公司是用 uid作为文件名的,也就是用户上传的文件 由服务器命名
      • 0ab3b8aff884:请问有下载功能么?向学习一下
        0ab3b8aff884:@Doming 因为刚接触Django不太熟,想问一下现在已经把路径存储在数据库中了,你是通过什么方式把这些数据显示在前台并提供下载功能的?
        Passon_Fang:@矛盾共存体的自己 ios,android?使用第三方库进行下载就行了
        Passon_Fang:@矛盾共存体的自己 移动端的下载功能?
      • Joker_Captain:您好,向您请教一个问题,如果想将文件存到一个指定目录如何做,没有使用Model
        Passon_Fang: @kobolds 没记错的话,在 def handle_uploaded_file(f): 方法里面写保存文件的代码
      • feba107b11d5:python2.7下可以运行吗
        Passon_Fang:@feba107b11d5 python语法可能会有小出入,按照语法报错改改应该没问题

      本文标题:使用Django创建文件上传服务器

      本文链接:https://www.haomeiwen.com/subject/namomttx.html