koa文件上传(详解koa-body)

2023-11-06

koa-body

const koa = require('koa')
const koaBody = require('koa-body')
const path = require('path')
const app = new koa()
let app = new Koa();
app.use(koaBody({
      // 支持文件格式
      multipart: true,
      formidable: {
          // 上传目录
          uploadDir: path.join(__dirname, './static'),
          // 保留文件扩展名
          keepExtensions: true,
      }
}))
let r1 = router()
app.use(r1.routes());


r1.post('/file', async (ctx, next) => {
    ctx.set('Access-Control-Allow-Origin', '*');
    ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
    ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
    const file = ctx.request.files.file
    ctx.body = { path: file.path }

})

前端,target是让页面表单提交不刷新页面主页有讲过不刷新页面的几种方法

	<form action="http://127.0.0.1:301/file"  
	method="post" 
	enctype="multipart/form-data" target="hidden">

我们打印file看看都有哪些东西

    console.log(file)
File{  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  size: 96938,
  path:
   'C:\\Users\\lx997\\Desktop\\v1.2\\plaformServer\\static\\upload_556a3f67a68a1fa91e2a447513780ba3.jpg',
  name: '微信图片_20200213181546.jpg',
  type: 'image/jpeg',
  hash: null,
  lastModifiedDate: 2020-03-13T03:10:15.545Z,
  _writeStream:
   WriteStream {
     _writableState:
      WritableState {
        objectMode: false,
        highWaterMark: 16384,
        finalCalled: true,
        needDrain: true,
        ending: true,
        ended: true,
        finished: true,
        destroyed: true,
        decodeStrings: true,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        corked: 0,
        sync: false,
        bufferProcessing: false,
        onwrite: [Function: bound onwrite],
        writecb: null,
        writelen: 0,
        bufferedRequest: null,
        lastBufferedRequest: null,
        pendingcb: 0,
        prefinished: true,
        errorEmitted: false,
        emitClose: false,
        bufferedRequestCount: 0,
        corkedRequestsFree: [Object] },
     writable: false,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     path:
      'C:\\Users\\lx997\\Desktop\\v1.2\\plaformServer\\static\\upload_556a3f67a68a1fa91e2a447513780ba3.jpg',
     fd: null,
     flags: 'w',
     mode: 438,
     start: undefined,
     autoClose: true,
     pos: undefined,
     bytesWritten: 96938,
     closed: false } 

不难发现我们上传的图片默认图片名字被加密定义,为了避免文件名重复我们可以继续使用它们自定义名称,但是怎么把图片通过地址传给前端
在这里插入图片描述
koa-static

//path.basename
var path= require("path");
path.basename('/foo/bar/baz/asdf/quux.html') 
// returns 
'quux.html' 
const koaStatic = require('koa-static')

app.use(koaStatic(path.join(__dirname, 'static')))
//ctx.origin 拿到服务器的域名

r1.post('/file', async (ctx, next) => {
    ctx.set('Access-Control-Allow-Origin', '*');
    ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
    ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
    const file = ctx.request.files.file
    ctx.body = { path: file.path }
    console.log(file)


    const basename = path.basename(file.path)
    ctx.body = { "url": `${ctx.origin}/static/${basename}` }
    let a = {"url": `${ctx.origin}/static/${basename}` }
    console.log(basename)
    console.log(a)
})

都能够正常打印但是我们发现访问图片找不到
在这里插入图片描述
仔细观法发现static被解析了两次这样的文件路径是static/static/图片地址
解决方法很简单随便删一处即可,成功
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

koa文件上传(详解koa-body) 的相关文章

随机推荐

  • MFC程序的诞生与死亡

    MFC程序的诞生与死亡 程序的诞生 Application object产生 内存于是获得配置 初值亦设立了 Afx WinMain执行AfxWinInit 后者又调用AfxInitThread 把消息队列尽量加大到96 AfxWinMai
  • django 国际化

    一 开启国际化 1 setting中默认语言改为 LANGUAGE CODE es es 2 添加中间件 django middleware locale LocaleMiddleware MIDDLEWARE CLASSES django
  • 「数字货币监管」听证会重磅来袭,无形之笼悄然降临?

    美国的国会老爷们要认真讨论数字货币的监管问题了 一个全方位的数字货币监管框架正在成型 作者 唐晗 编辑 秦晋 出品 碳链价值 ID cc value 美国国会对数字货币上瘾了 7月30日 美国参议院银行 住房和城市事务委员会将于华盛顿时间上
  • 配置wsl外网访问(实操步骤)

    介绍 wsl存在一个ip1 window存在一个ip2 ip1无法ping通与ip2处于同一网段下的ip 此种情况下 涉及到网络通信相关的开发就比较困难 本文介绍配置wsl外网的访问 操作步骤 获取wsl的ip 管理员身份在powershe
  • Jenkins安装部署与自动化部署网站实战

    1 CICD与Jenkins概述 互联网软件的开发和发布 已经形成了一套标准流程 假如把开发工作流程分为以下几个阶段 编码 构建 集成 测试 交付 部署 在上图中看到 持续集成 Continuous Integration 持续交付 Con
  • 数据结构-1

    1 2 线性结构树状结构网状结构 表 数 图 数据 数值型 非数值型 1 2 3数据类型和抽象数据类型 1 3抽象数据类型 概念小结 线性表 如果在独立函数实现的 c 文件中需要包含 stdlib h 头文件 而主函数也需要包含 stdli
  • 服务器部署Java项目详述

    前言 记录一下自己从0到1部署Java前后端项目到服务器上的过程 过程梗概 首先要先买一个服务器 一般用CentOS7 然后大概步骤是再配置一下所买的服务器环境 再安装下对应我们的Java项目所需要的一些应用程序即可 其中 Nginx是用来
  • 如何部署LVS + keepalived 负载均衡高可用集群

    目录 一 LVS架构 概念 L4和L7负载均衡的区别 keepalive故障自动切换 抢占与非抢占 二 keepalived管理LVS负载均衡器 LVS集中节点的健康检查 三 部署LVS keeplived 高可用集群 第一步 关闭防火墙和
  • Scala中 常用容器类的函数/方法

    1 foreach 迭代遍历集合中的每个元素 对每个元素进行处理 但是没有返回值 常用于打印结果数据 val ls List 1 3 5 7 9 ls foreach println 打印每个元素 ls foreach println 打印
  • kzalloc 函数详解

    用kzalloc申请内存的时候 效果等同于先是用 kmalloc 申请空间 然后用 memset 来初始化 所有申请的元素都被初始化为 0 kzalloc allocate memory The memory is set to zero
  • wpf

    Windows Presentation Foundation WPF 是微软新一代图形系统 运行在 NET Framework 3 0架构下 为用户界面 2D 3D 图形 文档和媒体提供了统一的描述和操作方法 基于DirectX 9 10
  • DP和HDMI区别

    转自 https www toutiao com i6877677362054595080 在目前市面上显示器接口中 VGA和DVI已经逐渐退出了历史舞台 Type C还算是小众 而DP DisplayPort 与HDMI则成为了主流产品的
  • 普通人在chatGPT的3个赚钱机会

    短短的2个多月内 到处都在讨论ChatGPT 不管你有没有参与其中 以GPT为代表的AI工具已经进化到一个很恐怖的程度了 比如说最近爆火的AutoGPT 能按照一个指令自动干活了 好想试一下 让AutoGPT自动帮我分析福利彩票 ChatG
  • 实现el-form一行中多个el-form-item

    el form item默认一个占一行 利用el row和el col实现一行中多个 注意 el col span 12 中的12是一个占据的列数 默认一列总共24列 通过调整这个数字 可以调整不同列的宽度 如果只使用el col 不在外面
  • c++23中的新功能之一介绍

    一 c 23的目标和延革 c 的标准发展速度在经过c 11的近乎可以称革新的变化之后 开始步入了快车道 有的人在网上说 c 11后的c 语言和c 11以前的c 语言不是一个语言 这有点夸张了 但不可否认 其内容确实变化非常大 很多人可能都没
  • 异步处理机制 多线程

    在处理程序执行流程时 一定要切记 android的处理机制是异步处理 多线程的它并不会因为一个线程处于阻塞状态时其他的线程就不往下执行了 看看代码是不是一个线程的 如果是一个线程的 线面就阻塞了 转载于 https www cnblogs
  • SpringBoot项目将数据源变成Json文件(Jackson2RepositoryPopulatorFactoryBean实现)

    一 项目情景 有时在我们项目当中需要存储一些固定值时 会使用一些配置文件来存储 例如最常见的 json文件 它可以用来存储相应的属性以及属性值 当你需要的时候进行提取 甚至还可以基于这个 json文件写一些条件查询的语句来获得自己需要的值
  • 正则表达式转义字符

    正则表达式的转义字符 除 外 其他字符与自身匹配 点的转义 gt u002E 美元符号的转义 gt u0024 乘方符号的转义 gt u005E 左大括号的转义 gt u007B 左方括号的转义 gt u005B 左圆括号的转义 gt u0
  • 浙大python网_Python爬虫学习(8):浙大软院网络登陆保持

    在浏览器的验证窗口中输入登陆名和密码后 成功后会弹出一个小的新窗口 如果不小心关闭了这个窗口 则就会无法联网 如果说我在一个不带有桌面的Linux系统中 我是不能够通过浏览器接入网络的 虽然提供了不同系统的不同版本的客户端 没有用过 但是还
  • koa文件上传(详解koa-body)

    koa body const koa require koa const koaBody require koa body const path require path const app new koa let app new Koa