季布, 2022-10-31 14:16 采纳率: 35.1%
浏览 69
已结题

flask vue elementui进行文件的上传和下载

使用flask和vue(elementui)进行文件的上传和下载,前端将文件传给后端,后端处理后前端可进行下载,后端处理文件需要一定的时间,所有前端在等待的时候设置进度条,其实上传和下载是同一个文件

img

后端处理成功会显示一个下载的按钮,该按钮可以对处理后的文件进行下载

<template>
  <div class="upload-file">
    <!-- 拖拽上传区域 -->
    <el-upload
      ref="upload"
      action="#"
      multiple
      :http-request="httpRequest"
      accept=".docx"
      :file-list="fileList"
      :auto-upload="false"
      drag
      :before-upload="checkfiletype"
    >
      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
      <div class="el-upload__text">
        Drop file here or <em>click to upload</em>
      </div>
      <template #tip>
        <div class="el-upload__tip">
          Currently only docx format is supported
        </div>
      </template>
    </el-upload>
    <el-button style="margin-left: 10px" type="success" @click="submitFileForm"
      >Upload</el-button
    >

    <el-button style="margin-left: 10px" type="success" v-show="isButton"
      >Download</el-button
    >
  </div>
</template>


export default {
  data() {
    return {
      fileList: [],
      isButton: false,
    };
  },
  methods: {
    httpRequest(file) {
      let that = this;
      let formData = new FormData();
      formData.append("file", file.file);
      request
        .post("upload", formData)
        .then((res) => {
          if (res.data.code == 200) {
            request.post("download", formData).then((res) => {
              if (res.data.code == 200) {
                that.isButton = true;
                console.log("download success");
              }
            });

            console.log("success");
            this.$message.success("success!");
          } else {
            this.$message.error("error!");
          }
        })
        .catch(() => {
          this.$message.error("error!");
        });
    },

    // 判断上传的文件类型
    checkfiletype(file) {
      var filename = file.name;
      var filetype = filename.substring(filename.lastIndexOf("."));
      var acceptType = [".docx"];
      if (acceptType.indexOf(filetype) == -1) {
        ElMessage.error("Please upload paper with .docx suffix");
        return false;
      }
    },
    // 删除之前钩子
    handleFileRemove(file, fileList) {
      this.fileList = fileList;
    },
    // 提交上传文件
    submitFileForm() {
      this.$refs.upload.submit();
    },
  },
};

flask

class UploadResource(Resource):
    """上传文件"""
    def post(self):
        files = request.files.getlist('file')
        filenames = []
        error_filenames = []
        for file in files:
            if file and allowed_file(file.filename):
                filename = secure_filename(file.filename)
                file.save(os.path.join('uploads', filename))

            else:  # 文件后缀不符合类型
                error_filenames.append(file.filename)
        if error_filenames:  # 有文件上传失败的情况
            result = {
                'code': 200,
                'result': 'failure',
                'message': ",".join(error_filenames)
            }
            return result
        else:
            result = {
                'code': 200,
                'result': 'success',
                'message': ''
            }
            return result


文件可以正常的上传了,但是后续应该怎么做,需要具体的代码

  • 写回答

6条回答 默认 最新

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月1日
  • 修改了问题 10月31日
  • 创建了问题 10月31日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来