<form method="post" action="/index/upload" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfile"> <input type="submit" value="提交文件"> </form>
ectype="multipart-data"
,这是文件上传的固定编码格式,文件上传即表示向服务器提交资源,所以这里我们使用了 Post 方式进行提交。在 input 标签的 type 属性设置为了 file,这是提交文件的专用属性。再实现文件提交功能前,我们还需要在 settings.py 文件中进行配置,即设定文件的储存路径,如下所示:MEDIA_ROOT = os.path.join(BASE_DIR,'static/files')
设置媒体文件路径,在 index/static 文件下创建 files 目录,我们上传文件将被显示在这个目录中。下面就一起实现一个提交文件的功能,代码如下所示:#views.py文件 def uplod(request): if request.method=='GET': return render(request,'index/upload.html') elif request.method=='POST': #使用request.FILES['myfile']获得文件流对象file file=request.FILES['myfile'] #文件储存路径,应用settings中的配置,file.name获取文件名 filename=os.path.join(settings.MEDIA_ROOT,file.name) #写文件 with open(filename,'wb') as f: #file.file 获取文件字节流数据 data = file.file.read() f.write(data) return HttpResponse('成功保存了 %s 文件'%(file.name))然后新建 upload.html 文件并编写如下代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form method="post" action="" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfile"> <input type="submit" value="提交"> </form> </body> </html>在 Form 表单中 enctype 有两个属性值,另外一个是默认即 application/x-www-form-urlencoded ,它是表单默认的提交数据的方式,而文件提交我们就需要使用multipart/form-data。
import os Path1 = 'c' Path2 = 'biancheng' Path3 = 'yan' Path4 = Path1 + Path2 + Path3 Path5 = os.path.join(Path1,Path2,Path3) print ('Path10 = ',Path10) print ('Path20 = ',Path20) #输出结果 #Path4= cbianchengyan #Path5 = c\biancheng\yan最后我们配置路由映射关系,看一下实际的效果,访问 127.0.0.1:8000/index/upload,并选择一个文件进行上传,如下所示:
<input type="file" name="myfiles" multiple="">
就可以实现多文件同时上传了。这里需要注意的是由于 request.FILES['myfile'] 只能够得到最后一个,所以我们要使用下面的方法:files = request.FILES.getlist('myfiles')然后通过循环获得 file 文件流对象,最后实现多文件上传,大家可以自己 to do 一下。
# 生成csv文本导出 def test_csv(request): #生成csv文本 #生成response的content-type头 res=HttpResponse(content_type='text/csv') #固定格式,添加 content-Disposition头,设置以附件方式下载,并给文件添加默认文件名 res['Content-Disposition']='attachment;filename="allUser.csv"' # 获取数据库中数据 users=UserInfo.objects.all() # 生成writer的写对象 writer=csv.writer(res) # 写csv表头,即想要展示字段名 writer.writerow(['username','gender']) # 写具体数据 for user in users: writer.writerow([user.username,user.gender]) return res响应对象 res 获得一个特殊的 MIME 媒体类型即 text/csv。这告诉浏览器该文档是 CSV 文件,而不是 HTML 文件;响应会获得一个额外的 Content-Disposition 标头,其中包含 CSV 文件的名称。它将被浏览器用于“另存为...”对话框;对于 CSV 文件中的每一行的写入,会调用
writer.writerow
给该方法传递一个可迭代对象,比如列表或元组。注意:Content-Disposition 为属性名将它的值设置为 attachment, 这代表以附件方式进行下载。比如:Content-Disposition: attachment; filename=xxx.csv。
最后完成路由的配置,访问 127.0.0.0:8000/index/csv,就会自动生成 CSV 文件,将数据库中用户表数据导出,我们可以将这个链接它放入一个 <a> 标签中,这样就可以实现在我们想要的页面下载用户数据了。点击自动下载效果图如下所示:Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有