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

如何实现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的作用,如下图:
如何实现html上传文件并被Django后台处理_第1张图片
所以,正如图中所说,在使用包含文件上传控件的表单时,必须使用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属性值没写,搞了我一晚上,到处查资料,结果原因竟然是它,也是醉了。说明基础知识还是要掌握扎实才行!!

我的个人博客

欢迎大家访问我搭建的个人博客哦,通过github Page搭建的,基于hexo,用了next主题。有什么问题都可以互相交流。博客地址:我的个人博客:CodeSausage的博客

你可能感兴趣的:(Django开发)