美文网首页
Django2_自动上传下载文件

Django2_自动上传下载文件

作者: 运维开发_西瓜甜 | 来源:发表于2020-06-28 12:16 被阅读0次

    请注意只有在请求是通过 POST 提交且提交的 <form> 表单有 enctype="multipart/form-data" 属性的时候,request.FILES 才会包含文件数据,否则的话, request.FILES 是空的。

    通常可能像这样处理上传文件:

    def handle_uploaded_file(f):
        with open('some/file/name.txt', 'wb+') as destination:
            for chunk in f.chunks():
                destination.write(chunk)
    

    使用 UploadedFile.chunks() 而不是 read() 是为了确保即使是大文件又不会将我们系统的内存占满。

    使用 UploadedFile.chunks() 而不是 read() 是为了确保即使是大文件又不会将我们系统的内存占满。


    假如用户上传一个图片文件作为自己的头像或者作为一个 logo, Django 该如何存放在本地。

    之后用户访问页面时,Django 又该如何从服务器中取出该图片响应给前端呢?

    Model 设计

    models.py

    class MyStatic(models.Model):
            name = models.CharField('姓名', max_length=64)
            image = models.ImageField(
                '头像', 
                upload_to='avatar/%Y/%m/%d/', 
                max_length=100)
    

    配置

    首先在 settings.py 中配置

    • 上传文件的根路径(针对上传)

      • 以后所有的图片都以此路径为自己的跟路径,自己的路径只需要写上相对路径即可。
    • 还需要配置路由相关信息(针对 GET 请求时的下载)

    首先在下项目的根目录下创建 media 文件夹

    增加配置

    settings.py

    # 访问文件的 url
    MEDIA_URL = '/media/'
    
    # 存储文件的路径
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    

    django.template.context_processors.media

    假如希望在模板语言中使用变量 {{ MEDIA_URL }}, 例如:

    <img src={{ }}>
    

    如果启用了此处理器,则每个处理器都RequestContext将包含一个变量 MEDIA_URL,提供MEDIA_URL设置值。

    settings.py

    TEMPLATES = [
            {'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.media',
                ]
            }}
    ]
    
    

    上传

    urls.py

    from django.conf.urls import url
    from learning_static import views as static_views
    
    from LearningDjango1.settings import MEDIA_ROOT
    from django.views.static import serve
    
    urlpatterns = [
        url(r'^update/$', static_views.update),
        # 处理已上传文件的访问路由
        url(r'^media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT})
    ]
    

    views.py

    from learning_static.models import MyStatic
    def update(request):
            if request.method == "POST":
                    name = request.POST.get('name')
                    file_name = request.FILES.get('file')
                    print(name, type(file_name))
                    obj = MyStatic()
                    obj.name = name
                    obj.image = file_name
                    obj.save()
                    return HttpResponse("上传成功")
            else:
                 return render(request, 'media.html')
    

    media.html

    <form action="/update/" method="post" enctype="multipart/form-data">
        名称<input type="text" name="name">
        <input type="file" name="file">
        <button type="submit">提交</button>
        {% csrf_token %}
    </form>
    

    访问(下载)

    urls.py

    from django.conf.urls import url
    from learning_static import views as static_views
    
    from LearningDjango1.settings import MEDIA_ROOT
    from django.views.static import serve
    
    urlpatterns = [
        url(r"^show_image/$", static_views.show_image),
    
        # 处理已上传文件的访问路由
        url(r'^media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT})
    ]
    

    views.py

    def show_image(request):
            file_name = request.GET.get('name')
            file_obj = MyStatic.objects.filter(name=file_name).first()
            return render(request,
                          'show_media.html',
                          {"image": file_obj})
    

    show_media.html

    <form action="{% url 'access' %}">
        <input type="text" name="name">
        <button type="submit">提交</button>
    </form>
    <div>
        <img src="{{ MEDIA_URL }}{{ image.image }}" alt="头像">
    </div>
    

    相关文章

      网友评论

          本文标题:Django2_自动上传下载文件

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