您的位置:首页 > Web前端 > HTML

如何实现html上传文件并被Django后台处理

2019-01-05 10:27 645 查看

如何实现html上传文件并被Django后台处理

1.html前端代码编写:

先看代码,代码如下:

<form action="/order_upload/"  method="post" enctype="multipart/form-data">

<ul class="forminfo">
<div class="">
<li><label>选择文件</label>
<input type="file" id="info_file" name="info_file" class="dfinput" style="display:none;" onchange="change();" />
<input type="text" id="info_file_tmp" name="info_file_tmp" class="dfinput" readonly="readonly" onclick="info_file.click();">
<button name="" type="button" class="btn" onclick="info_file.click();" >浏览</button>
<i>文件必须是Excel文件</i>
<li><input type="submit" class="btn" value="确认保存" style="float:left; margin-right:15px;"/></li>
</li>

</div>
</ul>
{% csrf_token %}
</form>

注意,这里的核心代码是Form标签和input type=file 标签,Form标签一定要添加enctype="multipart/form-data"这一属性!!!!因为这里涉及到enctype的作用,如下图:

所以,正如图中所说,在使用包含文件上传控件的表单时,必须使用multipart/form-data,而不是默认的application/x-www-form-urlencoded!!!
(因为这点,花了我一晚上的时间,搞不出来,就是因为这点!!基础知识很重要!)

2.Django端后台代码编写:

同样,先看代码:(注意,是要写在View.py文件里)

def orderupload(request):
#实现订单上传
if request.method == "POST":
obj = request.FILES.get('info_file')
baseDir = os.path.dirname(os.path.abspath(__name__))
orderDir = os.path.join(baseDir, 'userfile', 'orderfile')
filename = os.path.join(orderDir, obj.name)
fobj = open(filename, 'wb')
for chrunk in obj.chunks():
fobj.write(chrunk)
fobj.close()

return render(request, 'form.html')

这里的代码,思路是当提交method为“POST”的时(这个是由前端html中Form属性决定),通过request.FILES.get方法来获取文件对象,这里的’info_file’就是前端input type=‘file’ 标签里的name属性所对应的值。然后,baseDir,orderDIr,filename是为了在后端的userfile文件夹下的orderfile文件夹里,将网页前端得到的数据,写到该文件里,通过open(filename,wb)来创建一个文件输出流,通过for循环语句,写入文件。

以上就是通过html上传文件并被Django后台处理的方法,因为一个enctype属性值没写,搞了我一晚上,到处查资料,结果原因竟然是它,也是醉了。说明基础知识还是要掌握扎实才行!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: