• Django+Vue中文件的上传和下载


    场景:上传一个源数据Excel文件,然后根据数据处理生成另外一个Excel文件并支持下载

    Django:

    1.首先在Django的settings.py文件中增加配置

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

    2.项目的urls.py中增加

    url(r'^media/(?P.*)$', serve, {"document_root": MEDIA_ROOT}),
    

    3.在APP的models.py中内容

    # 文件模型
    class TestTrafficFileModel(models.Model):
        id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
        upload_name = models.CharField(max_length=50, verbose_name='源数据文件名称', help_text='源数据文件名称')
        upload_file = models.FileField(upload_to='uploads/', verbose_name='上传文件路径', help_text='上传文件路径')
        handle_name = models.CharField(max_length=50, verbose_name='处理后文件名称', help_text='处理后文件名称')
        handle_file = models.FileField(upload_to='uploads/', verbose_name='数据处理文件路径', help_text='数据处理文件路径')
        upload_time = models.DateTimeField(auto_now_add=True, verbose_name='上传时间', help_text='上传时间')
        update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')
    
        class Meta:
            db_table = 'test_traffic_files_storage'
            verbose_name = '测试工具文件存放表'
            verbose_name_plural = verbose_name
            ordering = ('id',)
    
        def __str__(self):
            return self.name
    

    4.在APP的serializers.py中的内容

    class FilesSerializer(serializers.ModelSerializer):
        sheet_name = serializers.CharField(label='sheet表名', read_only=True)
    
        class Meta:
            model = models.TestTrafficFileModel
            fields = '__all__'
            extra_kwargs = {
                "id": {
                    "read_only": True
                },
                "handle_file": {
                    "read_only": True
                },
                "handle_name": {
                    "read_only": True
                },
                "upload_time": {
                    "format": "%Y-%m-%d %H:%M:%S"
                },
                "update_time": {
                    "format": "%Y-%m-%d %H:%M:%S"
                },
            }
    
        def create(self, validated_data):
            instance = super(FilesSerializer, self).create(validated_data)
            # 上传源数据内的sheet表名
            instance.sheet_name = instance.upload_name.replace('_', ' ').split('.')[0]
            # 因上传后,实际表名与上传表名有区别,需将上传表名设置成实际表名
            instance.upload_name = str(instance.upload_file).split('/')[1]
            return instance

    5.在APP的views.py中的内容

    class DataHandleViewSet(ModelViewSet):
        queryset = models.TestTrafficFileModel.objects.all()
        serializer_class = serializers.FilesSerializer
        ordering_fields = ['id']
    
        def create(self, request, *args, **kwargs):
            response = super().create(request, *args, **kwargs)
            log.info(response)
            id = response.data.get('id')
            sheet_name = response.data.get('sheet_name')
            excel_name = response.data.get('upload_name')
            # 对数据做处理后返回表的title和表源数据列表
            res = handle_excel_data(file=f'media/uploads/{excel_name}',sheet_name=sheet_name)
            # 生成新的Excel后返回新的表名
            handle_file = genttle_sm_analysis_excel(*res)
            # 获取新表文件名
            handle_name = handle_file.split('/')[1]
            # 将新表文件名和文件地址写入数据库
            self.get_queryset().filter(id=id).update(handle_name=handle_name,handle_file=handle_file)
            return response

    Vue前端methods内容

    // 下载文件

        cellClick({ row, column, cell, event }) {

          if (column.label === '数据处理后的文件') {

            window.open(row.handle_file)

          }

        },

        // 上传文件

        uploadFile() {

          const uploadForm = new FormData() // 一个formdata

          const files = this.$refs.upload.$refs.uploadExcelForm.uploadFiles[0].raw // 获取文件数据

          const name = this.$refs.upload.$refs.uploadExcelForm.uploadFiles[0].name // 获取文件数据

          uploadForm.append('upload_file', files)

          uploadForm.append('upload_name', name)

          this.loading = true

          file_uploads(uploadForm).then(res => {

            this.loading = false

            this.uploadVisible = false

            this.getTableData()

            this.$message.success('操作成功!')

          }).catch(res => {

            this.loading = false

            this.$message.warning(res.data)

          })

        },

     

  • 相关阅读:
    初步认识Java
    用libmodbus实现一个支持多客户端的modbus tcp server (slave)
    储能电源/移动电源专用升降压DC-DC方案PL9405
    移除元素 - 力扣(Java)
    金仓数据库 KingbaseES 插件参考手册 O
    Java MyBatis查询数据库&结果映射 之ResultMap的使用
    bp神经网络遗传算法举例,bp神经网络 遗传算法
    GB28181学习(四)——网络设备信息查询
    Flyway-数据库管理工具使用与命令
    【css】iconfont的使用
  • 原文地址:https://blog.csdn.net/yt1318519610/article/details/128038106