Django文件上传

文件上传

文件上传是网站开发中非常常见的功能。这里详细讲述如何在Django中实现文件的上传功能。

form表单形式的文件上传

前端代码部分:

  • 在前端中,我们需要填入一个form标签,然后在这个form标签中指定enctype="multipart/form-data",不然就不能上传文件。
  • 在form标签中添加一个input标签,然后指定input标签的name,以及type="file"
<form action="{% url 'cms:upload_file'%}" enctype="multipart/form-data" method="post">
    {% csrf_token %}
    <input type="file" name="file" >
    <input type="submit" value="提交">
</form>

后端代码部分:
后端的主要工作是接收文件。然后存储文件。接收文件的方式跟接收POST的方式是一样的,只不过是通过FILES来实现。示例代码如下:

# 文件上传(form表单的形式)
def upload_file(request):

    if request.method == 'GET':
        return render(request,'cms/test.html')
    else:
        file = request.FILES.get('file')
        print(file,type(file),file.name,file.size/1024)
        with open(file.name,'wb') as fp:
            for i in file.chunks():
                fp.write(i)
        return HttpResponse('ok')

ajax形式的文件上传

html代码部分:

{% csrf_token %}
<input type="file" name="file" id="btn">

js代码部分:
因为csrf的问题,所以引用了xfzajax

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script src="{% static 'js/xfzajax.min.js' %}"></script>
<script>
    var btn = $('#btn');
    btn.change(function () {
        var file = btn[0].files[0];
        var formData = new FormData();
        formData.append('file',file);
        xfzajax.post({
            url:"/cms/upload_file/",
            data:formData,
            processData:false,
            contentType:false,
            success: function (result) {
                if(result['code']===200){
                    window.location.reload();
                }
            }
        })
    });
</script>

后端部分代码:
后端代码和form表单的代码一致,只不过返回值需要和符合规范

def upload_file(request):
    if request.method == 'GET':
        return render(request,'cms/test.html')
    else:

        file = request.FILES.get('file')
        print(file)
        with open('1111','wb') as fp:
            for i in file.chunks():
                fp.write(i)
        return restful.ok()

指定MEDIA_ROOT和MEDIA_URL

如果想要想上传的文件归纳到一起,就需要指定media_root和media_url

MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/

然后我们可以在urls.py中添加MEDIA_ROOT目录下的访问路径。示例代码如下:

from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('', views.index),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

最后在视图函数中修改一下文件路径,示例代码如下:

from django.conf import settings
import os
def upload_file(request):
    if request.method == 'GET':
        return render(request,'cms/test.html')
    else:
        file = request.FILES.get('file')
        print(file)
        with open(os.path.join(settings.MEDIA_ROOT,file.name),'wb') as fp:
            for i in file.chunks():
                fp.write(i)
        return restful.ok()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值