Django 批量保存图片文件 自定义上传方法

1.前端通过formData的方式批量增加图片或文件

        for (var i = 0; i < form_img_list.length; i++) {
            formData.append('image_file', form_img_list[i]);
        }

 

AJAX写法

复制代码
    $('#submit_save_b').click(function (e) {
        //formData 增加值
        e.preventDefault()
        console.log(form_img_list,33333);
        for (var i = 0; i < form_img_list.length; i++) {
            formData.append('image_file', form_img_list[i]);
        }

        formData.append('advertiser', $('#base_username_id').text());
        formData.append('campaign_name', $('#adv_name_value').val());
        formData.append('campaign_id', $('#adv_plan_value').val());
        formData.append('data', $('#adv_des_value').val());
        formData.append('title', $('#adv_title_value').val());
        formData.append('ad_imp_type', $('#ad_imp_type').val());
        formData.append('landing_url', $('#adv_landing_value').val());
        formData.append('enable', 1);
        formData.append('remove_img_list', remove_img_list);

        console.log(formData);

        var checkText = $("#id_select_ad_campaing").find("option:selected").text();
        if (checkText == '请选择广告计划:') {
            alert('请选择广告计划');
            return false;
        }

        var csrftoken = getCookie('csrftoken');
        $.ajax({
            cache: false,
            type: 'POST',
            data: formData,
            url: '/advertisement_list/',
            traditional: true, //为必须内容   
            //dataType:'json', //data为json时必须
            processData: false, //为必须内容
            contentType: false, //为必须内容
            success: function (data, textStatus, jqXHR) {
                console.log(data);
                if (jqXHR.status == 201) {
                    $('.page-content').fadeOut(300,function(){
                        $('.center').fadeIn(300)
                    })
                    show_list_table();
                    $('#Adver_Cell_Modal').modal('hide');
                    form_ad_campaing_reset();
                }

            },
            beforeSend: function (xhr, settings) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            },
            error:function(data){
                console.log(222)
            }
        });
    });
复制代码

 

View写法

#获取多个文件
upload_images = request.FILES.getlist('image_file')

 

复制代码
for a_index, afile in enumerate(upload_images):
#调用自定义上传文件方法 f_name, f_path
= oss_storage.handle_uploaded_file(afile) # 保证文件名不重复 current_time = time.time() current_time = '{}_{}'.format(current_time, str(random.randint(1, 100))) image_url = 'http://liquid-xad.oss-cn-beijing.aliyuncs.com/{}/{}'.format('upload_test', '{}_{}'.format( current_time, str(f_name))) oss_path = 'upload_test/{}'.format('{}_{}'.format(current_time, str(afile))) f_path_name = '{}{}'.format(f_path, f_name) upload_status = oss_storage.upload(oss_path, f_path_name) print(upload_status) advertismen.ad_imp_type = p_ad_imp_type advertismen.img_url = '' if a_index == 0: advertismen.img_url_2 = image_url advertismen.save() os.remove(f_path_name) if a_index == 1: advertismen.img_url_3 = image_url advertismen.save() os.remove(f_path_name) if a_index == 2: advertismen.img_url_4 = image_url advertismen.save() os.remove(f_path_name) advertismen.save()
复制代码

 

自定义上传方法

复制代码
class Oss_Storage(object):
    def handle_uploaded_file(self,f):
        path = os.path.abspath(MEDIA_ROOT)
        file_path = '{}/file/'.format(path)
        BASE_DIR = file_path
        try:
            path = BASE_DIR
            if not os.path.exists(path):
                os.makedirs(path)
            else:
                file_name = str(path + f.name)
                destination = open(file_name, 'wb+')
                for chunk in f.chunks():
                    destination.write(chunk)
                destination.close()
        except Exception as e:
            print(e)
        return f.name, path
     
复制代码

 

posted on   星河赵  阅读(540)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示