美文网首页
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