请注意只有在请求是通过 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>
网友评论