Django-网页图片上传

文件上传和文件复制类似,文件复制需要打开两个文件,一边读取,一边写入。
原始方法:
先制作出上传图片的页面

# urls.py
urlpatterns = [
    url(r'^upload_file/', views.upload_file, name='upload_file'),
]

文件上传,需要用到POST请求,模板页面如下:

# 如果请求是get,就显示上传文件的页面,如果是POST,则表示文件上传到后台
<form action="{% url 'app:upload_file' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <span>文件:span>
    <input type="file" name="icon">
    <br>
    <input type="submit" value="上传">
form>

网页传输不会将整个文件直接上传,使用enctype="multipart/form-data"将文件分成多个部分。
然后在views.py中获取文件对象。

def upload_file(request):
    if request.method == 'GET':
        return render(request, 'upload.html')
    elif request.method == 'POST':
        icon = request.FILES.get('icon')
        with open(r"C:\Users\LXYKER\PycharmProjects\ImgUpload\static\img\icon.jpg", 'wb') as save_file:
            for part in icon.chunks():
                save_file.write(part)
                save_file.flush()
        return HttpResponse('文件上传成功')

利用with open打开空文件,然后利用for循环将接收到的icon写入到该文件中。
“每接收到一部分,就冲一下马桶”,避免堵塞。

于是一个简单的网页图片上传就做好了。



将图片上传到数据库
利用ORM,在数据库中存放图片路径。首先创建UserModel的表:

from django.db import models


# Create your models here.
class UserModel(models.Model):
    u_name = models.CharField(max_length=16)

    # upload_to 指的是相对路径,相对于的是MEDIA_ROOT媒体根目录
    u_icon = models.ImageField(upload_to='icons')

表中有两个字段,一个存放用户名,另一个存放图片相对路径。需要在settings.py中添加MEDIA_ROOT = os.path.join(BASE_DIR, 'static/upload')
views.py中,如果是GET请求,渲染image_field.html,如果是POST请求,就需要创建一个UserModel的对象,然后将上传过来的usernam和icon保存下来:

def image_field(request):
    if request.method == 'GET':
        return render(request, 'image_field.html')
    elif request.method == 'POST':
        username = request.POST.get('username')
        icon = request.FILES.get('icon')

        user = UserModel()
        user.u_name = username
        user.u_icon = icon
        user.save()

        return HttpResponse('用户%s的头像上传成功' %user.u_name)

生成图片路径如下:
Django-网页图片上传_第1张图片在这里插入图片描述

更多内容,如Ajax上传头像、头像预览等功能,参考博客:Django项目实战之用户头像上传与访问

你可能感兴趣的:(笔记)