文件上传插件dropzone

Posted fqh202

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传插件dropzone相关的知识,希望对你有一定的参考价值。

1、相关下载

  • 下载dropzone.js文件:https://gitlab.com/meno/dropzone/-/jobs/79974233/artifacts/file/dist/dropzone.js
  • dropzone.css:f12取出样式并保存至static/css目录即可;

2、前端样式加载

<hr>
<p>已上传文件</p>
 <ul style="margin-top: 20px" id="upload_file_list">
    {# 此处 f 为文件名称,先取出对应文件夹的文件名称列表  #}
    {% for f in upload_files %}
        <li id="{% replace_str f %}">{{ f }}<span class="btn delete_btn" style="color: red">删除</span></li>
    {% endfor %}
</ul>
{#   #}
<form action="{% url 'enroll_file_upload' student_enroll.id %}" class="dropzone" id="myAwesomeDropzone">
    {% csrf_token %}
    <div class="fallback">
        <input name="file" type="file" multiple />
    </div>
</form>



<style>
    <link rel="stylesheet" href="{% static 'css/dropzone.css' %}">
    
    .dropzone {
        border: 2px dashed #0087F7;
        border-radius: 5px;
        background: white;
        min-height: 150px;
        padding: 54px 54px;
    }

</style>

<script src="{% static 'js/dropzone.js' %}"></script>

<script>
Dropzone.autoDiscover = false;//防止报"Dropzone already attached."的错误
$(".dropzone").dropzone({
    url: "{% url 'enroll_file_upload' student_enroll.id %}",
    addRemoveLinks: true,
    dictRemoveLinks: "x",
    dictCancelUpload: "x",
    paramName:"file",
    maxFiles: 10,  // 限定每次上传的文件数量
    maxFilesize: 4, // 限定大小
    acceptedFiles: ".jpg,.iepg,.png",  // 限定格式
    init: function() {
        //res为服务器响应回来的数据
        this.on("success", function(file, res) {
            //将json字符串转换成json对象
            var obj = JSON.parse(res);
            var file_name = file.name
            console.log(file,res)
            if( obj.status ){
                // 删除对应的文件,指定文件id,方便后续删除
                $('#upload_file_list').append('<li id='+file_name.replace(".","_")+'>'+file.name+
                    '<span class="btn delete_btn" style="color: red">删除</span></li>');
            }else{
                alert('上传失败');
            }
        });

        this.on("removedfile", function(file) {
            console.log(file.name);
            var stu_id = {{ student_enroll.id }}
            $.ajax({
                // 方便通过文件名称删除文件
              url: "/crm/enroll/file_delete/"+stu_id+"/"+file.name+'/',
              type: "get",
                success:function (data) {
                  data = JSON.parse(data)
                    if(data.status){
                      alert('删除成功')
                        alert(data.file_id)
                        // 在列表页也执行删除操作,但是怎么定位标签?
                        console.log( $('#'+data.file_id))
                        $('#'+data.file_id).remove()
                    }
                    else {
                      alert(data.error_msg)
                    }
                }
            });
        });
    }
});


// 删除文件
$('#upload_file_list').on('click','span',function () {
    $(this).parent().remove()
    var stu_id = {{ student_enroll.id }};
    console.log(stu_id)
    var s = $(this).parent().text()
    var file_name= s.substring(0,s.length-2)
    console.log(file_name)
    $.ajax({
        // 方便通过文件名称删除文件
        url: "/crm/enroll/file_delete/"+stu_id+"/"+file_name+'/',
        type: "get",
        success:function (data) {
            data = JSON.parse(data)
            if(data.status){
                alert('删除成功')
                // 在列表页也执行删除操作,但是怎么定位标签?
                console.log( $('#'+data.file_id))
                $('#'+data.file_id).remove()
            }
            else {
                alert(data.error_msg)
            }
        }
    });
})
         
</script>

4、自定义标签,生成li的id属性使用

from django.template import Library

register = Library()

@register.simple_tag
def replace_str(s):
    return str(s).replace('.','_')

5、路由配置

url(r'^enroll/(d+)/file_upload/$', views.enroll_file_upload, name='enroll_file_upload'),

6、文件上传路径配置settings.py

ORM_PATH_DIR = os.path.join(BASE_DIR,'crm/upload_files/enrollment_data/')

7、视图函数

# 上传文件配置
import os
from django import conf
from django.shortcut import render,HttpResponse
import json


def enroll_file_upload(request, enrollment_id):
    # 保存文件,对应的文件夹存在则保存至文件夹内,不存在则先创建文件夹
    enrollment_upload_dir = os.path.join(conf.settings.ORM_PATH_DIR, enrollment_id)
    if not os.path.isdir(enrollment_upload_dir):
        os.mkdir(enrollment_upload_dir)

    file_obj = request.FILES.get('file')
    
    # 限定上传的文件数量为2
    if len(os.listdir(enrollment_upload_dir)) <= 2:
        with open(os.path.join(enrollment_upload_dir, file_obj.name), "wb") as f:
            for chunks in file_obj.chunks():
                f.write(chunks)

    else:
        return HttpResponse(json.dumps({'status': False, 'err_msg': '最多上传两次'}))

    return HttpResponse(json.dumps({'status': True, }))
    

#  删除文件配置
def enroll_file_delete(request,stu_id,file_name):
    file_path = os.path.join(conf.settings.ORM_PATH_DIR,stu_id,file_name)
    if os.path.exists(file_path):
        os.remove(file_path)
        if request.is_ajax():
            return HttpResponse(json.dumps({'status':True,'file_id':str(file_name).replace('.','_')}))
        return

    else:
        print('no such file:%s' % file_path)
        return HttpResponse(json.dumps({'status':False,'error_msg':'没有找到此文件'}))



// 取出对应文件夹内容列表,放在主视图函数中
from django import conf
import os
enrollment_upload_dir = os.path.join(conf.settings.ORM_PATH_DIR,id)
if os.path.isdir(enrollment_upload_dir):
    upload_files=os.listdir(enrollment_upload_dir)

以上是关于文件上传插件dropzone的主要内容,如果未能解决你的问题,请参考以下文章

使用 dropzone 和使用 FormValidation 插件的其他表单字段上传多个文件

dropzone上传组件向java后台怎样传参数

dropzone.js 图片上传接受的MimeTypes

关于dropzone 设置图片上传大小等相关问题

dropzone js怎么去除上传触屏显示的字

限制 Dropzone 仅上传特定类型的文件