文件上传的关键代码在第三点,如何把文件读取到指定的路径
一、创建静态文件夹
在项目路径下创建static文件夹,再在static里面创建upload文件夹
二、设置配置文件
在settings.py配置文件中设置路径
STATICFILES_DIRS = [ BASE_DIR / 'static/' ]
UPLOAD_URL = BASE_DIR / 'static/upload'
三、 实现上传文件的代码
1.在templates中创建upload.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传图片</title> </head> <body> <h2>上传图片</h2> <hr> <form method="post" action="" enctype="multipart/form-data"> {% csrf_token %} <p>用户名:<input type="text" name="username"></p> <p>头像:<input type="file" name="icon"></p> <p><button>提交</button></p> </form> </body> </html>
2.创建视图函数方法
将文件读取到指定的路径,将路径存储到数据库
def upload1(request): if request.method == 'GET': return render(request, 'upload.html') elif request.method == 'POST': uname = request.POST.get('uname') icon = request.FILES.get('icon') # 接受上传的文件 # print(icon, type(icon)) # 文件对象 # picture1.jpg <class 'django.core.files.uploadedfile.InMemoryUploadedFile'> # print(icon.name) # 文件名"picture1.jpg" # 1. 将上传的图片存储到后台对应的媒体文件中 # file_name = icon.name # 尽量不使用原图名称 # 获取源文件的后缀名,即文件类型(.jpg) # file_name = gen_uuid_name() + icon.name[icon.name.rfind('.'):] # .jpg file_name = gen_uuid_name() + os.path.splitext(icon.name)[-1] # .jpg # 将文件名和路径合并 file_path = os.path.join(settings.MEDIA_ROOT, file_name) # 分端写入文件,其中‘ab’是读取文件模式--ab':以二进制追加模式打开文件,用于在二进制文件末尾追加数据。 with open(file_path, 'ab') as fp: for part in icon.chunks(): fp.write(part) fp.flush() # 清空缓存 # 2. 将该媒体文件的路径,存入到数据库中 user = UserModel() user.name = uname user.icon = 'uploads/' + file_name user.save() return redirect(reverse('showUser', kwargs={'userid': user.id}))
四、回显图片
html和视图函数
<head> <meta charset="UTF-8"> <title>用户详情</title> </head> <body> <h2>用户详情</h2> <hr> {% load static %} <p>用户姓名:{{ user.username }}</p> <p>用户头像:<img src="{% static user.icon %}" width="200px"></p> </body> </html>
def showUser(request, userid): user = User.objects.filter(id=userid).first() return render(request, 'showUser.html', {'user': user})
其中html有用到静态文件的相关知识,可以查看这篇文章
Python的Django框架静态文件使用,html引用css、js等文件-CSDN博客