django+ajax上传图片,预览并存储到数据库

1、配置url
urls.py中配置地址
在这里插入图片描述
2、在models.py中创建类

class Pictures(models.Model):
    pic = models.ImageField(upload_to='onlineBug/media')
    def __str__(self):
        return self.pic

3、在views.py中添加如下代码

class UploadForm(forms.Form):
    file = fields.FileField()

# 发来表单 实现上传功能
@csrf_exempt
@require_POST
def upload(request):
    if request.method == 'POST':
        try:
            # f1 = UploadForm(request.POST, request.FILES)
            # f1 = request.FILES.get('formData')
            f1 = request.FILES.getlist('file')
            for img in f1:
                random_name = str(int(random.random()*10000000000000000))
                img_name = img.name.split('.')
                print(img_name)
                if len(img_name) == 2:
                    print("img_name[0]:%s"%img_name[0])
                    new_img_name = img_name[0] + random_name + '.' +img_name[1]
                else:
                    new_img_name=''
                    for i in range(len(img_name)-1):
                        new_img_name += img_name[i]
                    new_img_name = new_img_name + random_name +'.'+ img_name[len(img_name)-1]
                print("new_img_name:%s"%new_img_name)
                print("进入for循环")
                # 利用模型类将图片要存放的路径存到数据库中
                print("img:%s"%img)
                p = Pictures()
                p.pic = 'onlineBug\\static\\onlineBug\\media\\'+ new_img_name
                print("p.pic:%s"%p.pic)
                p.save()
                # 在之前配好的静态文件目录static/media/onlineBug 下 新建一个空文件
                # 然后我们循环把上传的图片写入到新建文件当中
                fname = settings.MEDIA_ROOT+ "\\" + new_img_name
                print("fname:%s"%fname)
                with open(fname,'wb') as pic:
                    for c in img.chunks():
                        pic.write(c)
            return HttpResponse('1')
        except:
            return HttpResponse('2')
    else:
        return render(request, 'onlineBug/upload.html')

4、upload.html文件

<!DOCTYPE html>
<html lang="en">
{% load staticfiles %}
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'onlineBug/css/bootstrap.css' %}">
    <link rel="stylesheet" href="{% static 'onlineBug/css/bootstrap-theme.css' %}">
    <link rel="stylesheet" href="{% static 'onlineBug/css/dataTables.bootstrap.min.css' %}">
    <script src="{% static 'onlineBug/js/jquery.min.js' %}"></script>
    <script src="{% static 'onlineBug/js/bootstrap.js' %}"></script>
    <script src="{% static 'onlineBug/js/jquery.dataTables.min.js' %}"></script>
    <script src="{% static 'onlineBug/js/dataTables.bootstrap.min.js' %}"></script>
    <script src="{% static 'onlineBug/js/layer.js' %}"></script>
    <script src="{% static 'onlineBug/js/ajaxfileupload.js' %}"></script>
    <style type="text/css">
        .imageDiv {
            display:inline-block;
            width:160px;
            height:130px;
            -webkit-box-sizing:border-box;
            -moz-box-sizing:border-box;
            box-sizing:border-box;
            border:1px dashed darkgray;
            background:#f8f8f8;
            position:relative;
            overflow:hidden;
            margin:10px
        }
        .cover {
            position:absolute;
            z-index:1;
            top:0;
            left:0;
            width:160px;
            height:130px;
            background-color:rgba(0,0,0,.3);
            display:none;
            line-height:125px;
            text-align:center;
            cursor:pointer;
        }
        .cover .delbtn {
            color:red;
            font-size:20px;
        }
        .imageDiv:hover .cover {
            display:block;
        }
        .addImages {
            display:inline-block;
            width:160px;
            height:130px;
            -webkit-box-sizing:border-box;
            -moz-box-sizing:border-box;
            box-sizing:border-box;
            border:1px dashed darkgray;
            background:#f8f8f8;
            position:relative;
            overflow:hidden;
            margin:10px;
        }
        .text-detail {
            margin-top:40px;
            text-align:center;
        }
        .text-detail span {
            font-size:40px;
        }
        .file {
            position:absolute;
            top:0;
            left:0;
            width:160px;
            height:130px;
            opacity:0;
        }
 
    </style>
 
</head>
<body>
<!--<form method="post" action="../../MultiPictareaddData" id="passForm" enctype="multipart/form-data" multipart="">-->
<form action="" method="post" enctype="multipart/form-data" class="container"  >
<div id="Pic_pass">
    <p style="font-size: 20px;font-weight: bold;">请上传多张照片 </p>
    <p><span style="color: red">注:每张照片大写不可超过4M,且最多可以传十张</span></p>
    <div class="picDiv">
        <div class="addImages">
            <input type="file" class="file" id="uploadFilexxx"  name="file" multiple="multiple" accept="image/png, image/jpeg, image/gif, image/jpg">
            <div class="text-detail">
                <span>+</span>
                <p>点击上传</p>
            </div>
        </div>
        <button type="button" id="bbt">上传</button>
    </div>
</div>
<div class="msg" style="display: none;"></div>
</form>
<!--</form>-->
 
{#<script src="js/jquery.js"></script>#}
{#<script src="js/jquery.dataTables.min.js"></script>#}
{#<script src="js/jquery-easyui-1.4.3/jquery.easyui.min.js"></script>#}
<script>
    debugger;
    //图片上传预览功能
    var userAgent = navigator.userAgent; //用于判断浏览器类型
    //使用formData完成多图片上传
    var formData = new FormData();
    $(".file").change(function() {
        //获取选择图片的对象
        var docObj = $(this)[0];
        var picDiv = $(this).parents(".picDiv");
        //得到所有的图片文件
        var fileList = docObj.files;
        //将图片数据放到formData中传递后台
        if($(this)[0].files.length==1){
            formData.append("file",docObj.files[0]);
            console.log("一次拉进来了一张图片");
        }else{
            for(var i=0; i<$(this)[0].files.length;i++){
                formData.append("file",$(this)[0].files[i]);
                console.log("你这一次拉进来好几张图片呢");
            }
        }
        //循环遍历
        for (var i = 0; i < fileList.length; i++) {
            //动态添加html元素
            var picHtml = "<div class='imageDiv' > <img id='img" + fileList[i].name + "' /> <div class='cover'><i class='delbtn'>删除</i></div></div>";
            console.log(picHtml);
            picDiv.prepend(picHtml);
            //获取图片imgi的对象
            var imgObjPreview = document.getElementById("img" + fileList[i].name);
            if (fileList && fileList[i]) {
                //图片属性
                imgObjPreview.style.display = 'block';
                imgObjPreview.style.width = '160px';
                imgObjPreview.style.height = '130px';
                //imgObjPreview.src = docObj.files[0].getAsDataURL();
                //火狐7以上版本不能用上面的getAsDataURL()方式获取,需要以下方式
                if (userAgent.indexOf('MSIE') == -1) {
                    //IE以外浏览器
                    imgObjPreview.src = window.URL.createObjectURL(docObj.files[i]); //获取上传图片文件的物理路径;
                    console.log(imgObjPreview.src);
                    // var msgHtml = '<input type="file" id="fileInput" multiple/>';
                } else {
                    //IE浏览器
                    if (docObj.value.indexOf(",") != -1) {
                        var srcArr = docObj.value.split(",");
                        imgObjPreview.src = srcArr[i];
                    } else {
                        imgObjPreview.src = docObj.value;
                    }
                }
            }
        }
        /*删除功能*/
        $(".delbtn").click(function() {
            var _this = $(this);
            _this.parents(".imageDiv").remove();
        });
    });

    $("#bbt").click(function(){
        debugger;
        $.ajax({
            type:'post',
            dataType:'json',
            data:formData,
            cache: false, //上传文件不需要缓存
            url:'{% url 'onelinebug:upload' %}',
            processData: false, // 告诉jQuery不要去处理发送的数据
            contentType: false, // 告诉jQuery不要去设置Content-Type请求头
            success:function(e){
                if(e==="1"){
                    layer.msg("上传成功!",{icon:1,time:2000});
                    // 重定向页面

                }else{
                    layer.msg("上传失败!",{icon:2,time:2000});
                    }
                },
        })
    })
</script>
</body>
</html>

5、运行
在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。 这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。 平时不明白的知识点,放在项目里去理解就恍然大悟了。   一、融汇贯通 本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用Python 的Django框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。   二、贴近实战 本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战   三、课程亮点 在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互   适合人群: 1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友; 2、有Django基础,但是想学习企业级项目实战的朋友; 3、有MySQL数据库基础的朋友  
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值