文件上传、下载

文件上传、文件展示、文件删除、文件下载

models.py:

class KnowledgeFileDownload(models.Model):
    person = models.CharField("上传人", blank=True, null=True, max_length=64)
    upload_time = models.DateTimeField("上传时间", blank=True, null=True)
    remark = models.CharField("备注", blank=True, null=True, max_length=500)
    file_name = models.CharField("文件名称", blank=True, null=True, max_length=128)
    state = models.CharField("状态", blank=True, null=True, max_length=20)

urls.py:

url(r'^downloadlist/$', downloadlist, {'funid': '7'}),
url(r'^download/$', download),
url(r'^download_list_data/$', download_list_data),
url(r'^knowledge_file_del/$', knowledge_file_del),

views.py:

# 上传
def downloadlist(request, funid):
    if request.user.is_authenticated():
        errors = []
        if request.method == 'POST':
            file_remark = request.POST.get("file_remark", "")
            my_file = request.FILES.get("myfile", None)
            if not my_file:
                errors.append("请选择要导入的文件。")
            else:
                if if_contains_sign(my_file.name):
                    errors.append(r"""请注意文件命名格式,'/"*?<>'符号文件不允许上传。""")
                else:
                    myfilepath = settings.BASE_DIR + os.sep + "drm" + os.sep + "upload" + os.sep + "knowledgefiles" + os.sep + my_file.name

                    c_exist_model = KnowledgeFileDownload.objects.filter(file_name=my_file.name).exclude(state="9")

                    if os.path.exists(myfilepath) or c_exist_model.exists():
                        errors.append("该文件已存在,请勿重复上传。")
                    else:
                        with open(myfilepath, 'wb+') as f:
                            for chunk in my_file.chunks():  # 分块写入文件
                                f.write(chunk)

                        # 存入字段:备注,上传时间,上传人
                        c_file = KnowledgeFileDownload()
                        c_file.file_name = my_file.name
                        c_file.person = request.user.userinfo.fullname
                        c_file.remark = file_remark
                        c_file.upload_time = datetime.datetime.now()
                        c_file.save()

                        errors.append("导入成功。")
        return render(request, "downloadlist.html",
                      {'username': request.user.userinfo.fullname, "errors": errors,
                       "pagefuns": getpagefuns(funid, request=request)})
    else:
        return HttpResponseRedirect("/login")

# 展示
def download_list_data(request):
    if request.user.is_authenticated():
        result = []
        c_files = KnowledgeFileDownload.objects.exclude(state="9")
        if c_files.exists():
            for file in c_files:
                result.append({
                    "id": file.id,
                    "name": file.person,
                    "up_time": "{0:%Y-%m-%d %H:%M:%S}".format(file.upload_time),
                    "remark": file.remark,
                    "file_name": file.file_name,
                })

        return JsonResponse({
            "data": result
        })

# 删除
def knowledge_file_del(request):
    if request.user.is_authenticated():
        file_id = request.POST.get("id", "")
        assert int(file_id), "网页异常"

        c_file = KnowledgeFileDownload.objects.filter(id=file_id)
        if c_file.exists():
            c_file = c_file[0]
            c_file.delete()
            c_file_name = c_file.file_name
            the_file_name = settings.BASE_DIR + os.sep + "drm" + os.sep + "upload" + os.sep + "knowledgefiles" + os.sep + c_file_name
            if os.path.exists(the_file_name):
                os.remove(the_file_name)
            result = "删除成功。"
        else:
            result = "文件不存在,删除失败,请于管理员联系。"

        return JsonResponse({
            "data": result
        })

# 下载
def download(request):
    if request.user.is_authenticated():
        file_id = request.GET.get("file_id", "")
        assert int(file_id), "网页异常"
        c_file = KnowledgeFileDownload.objects.filter(id=file_id)
        if c_file.exists():
            c_file = c_file[0]
            c_file_name = c_file.file_name
        else:
            raise Http404()
        try:
            the_file_name = settings.BASE_DIR + os.sep + "drm" + os.sep + "upload" + os.sep + "knowledgefiles" + os.sep + c_file_name
            response = StreamingHttpResponse(file_iterator(the_file_name))
            response['Content-Type'] = 'application/octet-stream; charset=unicode'
            response['Content-Disposition'] = 'attachment;filename="{0}"'.format(
                escape_uri_path(c_file_name))  # escape_uri_path()解决中文名文件
            return response
        except:
            return HttpResponseRedirect("/downloadlist")
    else:
        return HttpResponseRedirect("/login")

downloadlist.html:

    <table class="table table-striped table-bordered table-hover table-checkable order-column" id="sample_1">
        <thead>
        <tr>
            <th style="40px;"> 序号</th>
            <th> 上传人</th>
            <th> 上传时间</th>
            <th> 备注</th>
            <th> 文件名</th>
            <th style="50px;"> 操作</th>
        </tr>
        </thead>

        <tbody>

        </tbody>
    </table>
  
  
    <div id="static1" class="modal fade" tabindex="-1" data-backdrop="static" data-keyboard="false">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                    <h4 class="modal-title">上传</h4>
                </div>
                <div class="panel-body">
                    <form action="" enctype="multipart/form-data" class="form-horizontal"
                          method="post">{% csrf_token %}
                        <div class="form-body">
                            <div class="form-group">
                                <label class="col-md-2 control-label"><span
                                        style="color:red; "></span>文件</label>
                                <div class="col-md-10">
                                    <div class="fileinput fileinput-new" data-provides="fileinput">
                                        <div class="input-group input-large">
                                            <div class="form-control uneditable-input input-fixed input-medium"
                                                 data-trigger="fileinput">
                                                <i class="fa fa-file fileinput-exists"></i>&nbsp;
                                                <span class="fileinput-filename"> </span>
                                            </div>
                                            <span class="input-group-addon btn default btn-file">
                                                <span class="fileinput-new"> 选择文件 </span>
                                                <span class="fileinput-exists"> 重新选择 </span>
                                                <input type="file" name="myfile">
                                            </span>
                                            <a href="javascript:;" class="input-group-addon btn red fileinput-exists"
                                               data-dismiss="fileinput"> 移除 </a>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <div class="form-group">
                                <label class="col-md-2 control-label"><span
                                        style="color:red; "></span>备注</label>
                                <div class="col-md-10">
                                    <input id="file_remark" type="text" name="file_remark" class="form-control "
                                           placeholder="">
                                    <div class="form-control-focus"></div>
                                </div>
                            </div>
                        </div>
                        <div class="form-actions ">
                            <div class="modal-footer">
                                <button type="submit" id="upload" name="upload" class="btn green uppercase">上传</button>
                                <button type="button" data-dismiss="modal" class="btn dark btn-outline">关闭
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>


    <link href="/static/assets/global/plugins/bootstrap-fileinput/bootstrap-fileinput.css" rel="stylesheet" type="text/css"/>
    <link href="/static/assets/global/plugins/datatables/datatables.min.css" rel="stylesheet" type="text/css"/>
    <link href="/static/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" type="text/css"/>
    <link href="/static/assets/global/css/components.css" rel="stylesheet" id="style_components" type="text/css"/>
    <link href="/static/assets/global/css/plugins.css" rel="stylesheet" type="text/css"/>
    <script src="/static/assets/global/plugins/datatables/datatables.min.js" type="text/javascript"></script>
    <script src="/static/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.js" type="text/javascript"></script>
    <script src="/static/assets/global/plugins/bootstrap-fileinput/bootstrap-fileinput.js" type="text/javascript"></script>

 downloadlist.js:

$('#sample_1').dataTable({
    "bAutoWidth": true,
    "bSort": false,
    "bProcessing": true,
    "ajax": "../download_list_data/",
    "columns": [
        {"data": "id"},
        {"data": "name"},
        {"data": "up_time"},
        {"data": "remark"},
        {"data": "file_name"},
        {"data": null}
    ],

    "columnDefs": [{
        "targets": -1,  // 指定最后一列添加按钮;
        "data": null,
        "width": "60px",  // 指定列宽;
        "render": function (data, type, full) {
            return "<td><button class='btn btn-xs btn-primary' type='button'><a href='/download/?file_id'><i class='fa fa-arrow-circle-down' style='color: white'></i></a></button>" +
                "<button title='删除'  id='delrow' class='btn btn-xs btn-primary' type='button'><i class='fa fa-trash-o'></i></button></td>".replace("file_id", "file_id=" + full.id)
        }
    }],
    "oLanguage": {
        "sLengthMenu": "每页显示 _MENU_ 条记录",
        "sZeroRecords": "抱歉, 没有找到",
        "sInfo": "从 _START_ 到 _END_ /共 _TOTAL_ 条数据",
        "sInfoEmpty": "没有数据",
        "sInfoFiltered": "(从 _MAX_ 条数据中检索)",
        "sSearch": "搜索",
        "oPaginate": {
            "sFirst": "首页",
            "sPrevious": "前一页",
            "sNext": "后一页",
            "sLast": "尾页"
        },
        "sZeroRecords": "没有检索到数据",
    }
});
// 删除 $('#sample_1 tbody').on('click', 'button#delrow', function () { if (confirm("确定要删除该条数据?")) { var table = $('#sample_1').DataTable(); var data = table.row($(this).parents('tr')).data(); $.ajax({ type: "POST", url: "../knowledge_file_del/", data: { id: data.id, }, success: function (data) { if (data.data === "删除成功。") { table.ajax.reload(); alert(data.data); } else alert(data.data); }, error: function (e) { alert("删除失败,请于管理员联系。"); } }); } }); // 新增 $("#new").click(function () { $("#file_remark").val(""); });

上传:

下载:

原文地址:https://www.cnblogs.com/zhangguosheng1121/p/14597234.html