重构文件上传行为


目标:将 [前端 → 后端] 改成 [前端 → 中间层 → 后端]


第一步:自定义上传行为(ElementPlus)

<template>
    <el-upload
        action=""
        show-file-list
        v-model:file-list="fileList"
        :on-change="handleChange"
        :on-success="handleSuccess"
        :on-error="handleError"
        :http-request="httpRequest"
    >
        <el-button type="primary">Click to upload</el-button>
    </el-upload>
</template>

<script setup>
import { ref } from 'vue';

const fileList = ref([]);

const handleChange = () => {
    fileList.value = fileList.value.slice(-1);
};

const httpRequest = async (item) => {
    const formData = new FormData();
    formData.append('data', item.file);
    formData.append('type', 'cdoShelf');

    const res = await fetch('http://127.0.0.1:8360/upload', {
        method: 'POST',
        body: formData,
    });
    console.log('[res]:', res);
};

const handleSuccess = (...args) => {
    console.log('handleSuccess', args);
};

const handleError = (...args) => {
    console.log('handleError', args);
};
</script>

要点 1:使用 http-request 自定义 el-upload 的上传行为
要点 2:POST 请求的数据格式为 FormData
要点 3:文件以 File 对象的形式传递


第二步:中间层转发(ThinkJS)

const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');

module.exports = class extends think.Controller {
    async postAction() {
        const data = this.post(); // 获取 body 参数
        const file = this.file(); // 获取文件
        console.log('[data]:', data);
        console.log('[file]:', file);

        const formData = new FormData();
        formData.append('file', fs.createReadStream(file.data.path));
        formData.append('type', data.type);

        const res = await axios({
            method: 'post',
            url: '后端的上传接口',
            data: formData,
        })
            .then(function (response) {
                think.logger.info('response-data', response.data);
                return response.data;
            })
            .catch(function (error) {
                think.logger.error('error', error);
                return Promise.reject(error);
            });
        console.log('[res]:', res);
    }
};

要点 1:Node 中没有 Fetch API,需要使用第三方库(上例为 Axios)发起请求
要点 2:POST 请求的数据格式为 FormData
要点 3:Node 中没有 File 对象,需要通过 fs 模块创建 Stream 对象来传递文件


相关推荐

  1. 重构文件行为

    2024-03-26 06:28:07       39 阅读
  2. nestjs文件

    2024-03-26 06:28:07       66 阅读
  3. springMVC-文件

    2024-03-26 06:28:07       68 阅读
  4. 文件

    2024-03-26 06:28:07       59 阅读
  5. springboot 文件

    2024-03-26 06:28:07       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 06:28:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 06:28:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 06:28:07       87 阅读
  4. Python语言-面向对象

    2024-03-26 06:28:07       96 阅读

热门阅读

  1. 2024华为软件精英挑战赛记录

    2024-03-26 06:28:07       78 阅读
  2. React 抽屉显示和隐藏

    2024-03-26 06:28:07       38 阅读
  3. React - 面试题

    2024-03-26 06:28:07       39 阅读
  4. 前端-包管理器

    2024-03-26 06:28:07       45 阅读
  5. 服务器离线配置vscode连接,conda虚拟环境

    2024-03-26 06:28:07       40 阅读
  6. LightDB24.1ECPG支持EXEC ORACLE OPTION语法

    2024-03-26 06:28:07       42 阅读
  7. 前端Ajax请求从后端获取二进制文件并下载

    2024-03-26 06:28:07       45 阅读
  8. 数字后端概念——FinFET/Nanosheet FET

    2024-03-26 06:28:07       47 阅读
  9. tengine | tengine-nnie编译

    2024-03-26 06:28:07       40 阅读
  10. 全球化战略中的技术纵深

    2024-03-26 06:28:07       41 阅读
  11. 视频中有无声音的检测

    2024-03-26 06:28:07       35 阅读
  12. ios 嵌入vuejs

    2024-03-26 06:28:07       31 阅读
  13. IOS面试题编程机制 61-65

    2024-03-26 06:28:07       37 阅读