likes
comments
collection
share

前端利用formData对象上传文件,以链接形式返回

作者站长头像
站长
· 阅读数 15

前言

环境搭建

后端我们还是使用我们熟悉的node.JS加koa来搭建我们的环境

  • 安装依赖
npm install koa --save
npm install koa-router --save
npm install koa-static --save
npm install koa-body  --save
npm i @koa/cors --save
npm i formidable --save
  • 搭建

    创建public文件夹 前端利用formData对象上传文件,以链接形式返回

var Koa = require("koa");
var app = new Koa();
var Router = require("koa-router")();
const koaBody = require("koa-body");
const formidable = require("formidable");
const path = require("path");
app.use(
  koaBody({
    // maxFieldsSize: 10 * 1024 * 1024, //10MB  文件上传大小限制
    multipart: true, //多文件上传
    formidable: {
      // 上传目录
      uploadDir: path.join(__dirname, "/public"),
      // 保留文件扩展名
      keepExtensions: true,
    },
  })
);
const koaStatic = require("koa-static");
app.use(koaStatic(path.join(__dirname, "public")));
// 跨域
const cors = require("@koa/cors");
app.use(cors());

Router.get("/", async (ctx) => {
  ctx.body = "OK";
});

app
  .use(Router.routes()) //启动路由
  .use(Router.allowedMethods());
app.listen(3000);

环境没有问题 前端利用formData对象上传文件,以链接形式返回

前端实现

需要安装一下axios

npm install axios --save
  • 前端代码
<template>
  <input type="file" @change="onChange" ref="img" multiple />
</template>

<script lang="ts" setup>
import { ref } from "vue";
import axios from "axios";
let img = ref();
const onChange = () => {
  let formdata = new FormData();
  for (let item of img.value.files) {
    formdata.append("file", item);
  }
  axios({
    method: "post",
    url: "http://127.0.0.1:3000/updata",
    data: formdata,
    //监听进度
    onUploadProgress: (ProgressEvent) => {
      console.log((ProgressEvent.loaded / ProgressEvent.total) * 100);
    },
  }).then((response) => {
    console.log(response.data);
  });
};
</script>

后端实现

添加路由

Router.post("/updata", async (ctx) => {
  let basenameList = [];
  const fileList = ctx.request.files["file"];
  //Array.isArray(fileList) ? fileList : Array(fileList)
  //为了单文件上传和多文件上传都可以读取到正确的路径
  for (let file of Array.isArray(fileList) ? fileList : Array(fileList)) {
    basenameList.push(file.newFilename);
  }
  let urlList = [];
  for (let k in basenameList) {
    urlList.push(`${ctx.origin}/${basenameList[k]}`);
  }
  ctx.body = urlList;
});

测试

  • 单文件上传

前端利用formData对象上传文件,以链接形式返回

  • 多文件上传

前端利用formData对象上传文件,以链接形式返回

文件已上传到了服务器

前端利用formData对象上传文件,以链接形式返回

也可以通过链接访问

前端利用formData对象上传文件,以链接形式返回