koa2 转发文件上传接口

发布于 2022-09-11 17:04:43 字数 667 浏览 18 评论 0

我用koa2 做了一层接口代理层,现在遇到一个问题就是转发文件上传不成功。
我的预期是 网页 调用form请求上传文件到 koa层,koa层在把收到的内容 用axios请求Java的接口,把接受到的内容传给Java。

现在其他的接口都可以顺利转发 ,就是上传接口不行呢,请求朋友们帮助,感激不尽。

我使用了 koa-body 中间件;

app.use(koaBody({
    multipart: true,
    strict: false,  //如果为true,不解析GET,HEAD,DELETE请求
    formidable: {
        maxFileSize: 200 * 1024 * 1024    // 设置上传文件大小最大限制,默认2M
    }
 }))

这是对应的方法

module.exports = async ctx => {
  let {data, status} = await ctx.axios({
    url: `/upload`,
    method: 'post',
    data: ctx.request.files
  })
  ctx.body = data
  ctx.status = status
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

盛夏已如深秋| 2022-09-18 17:04:43

你的files不是文件内容,而是文件存在本地的一些信息

好听的两个字的网名 2022-09-18 17:04:43

中间件就是起一个过渡作用,所以要注意传递的方式。参考代码如下:

module.exports = async ctx => {
  let formdata = new FormData()
  formdata.append('file', ctx.request.files.file)
    
  let {data, status} = await ctx.axios({
    url: `/upload`,
    method: 'post',
    data: formdata,
    headers: {
        'Content-Type': 'multipart/form-data'
    }
  })
}
有木有妳兜一样 2022-09-18 17:04:43

2019.11.25更新
快一年过去了,前段时间发现之前写的答案好像还是有问题,这两天重新搜了下上传文件转发的问题,发现除了这里有答案其他地方都屈指可数,再来更新下最新解决方案吧,相信遇到这个问题的肯定不止我一个。

首先为了解决这个问题主要依赖三个库:form-datakoa2-formidable以及axios
koa2-formidable: 目的是从koa的ctx中获取原始接口传过来的formData,之前使用koa-bodyparser发现无法获取formData,使用如下,在入口js文件(我这里是app.js)注册此模块:

form-data: nodejs中没有formData对象,需要借助这个库来实现formData的组装;

axios:进行接口请求

package.json中这三个模块的版本如下:

"koa": "^2.5.3"
"axios": "^0.17.1"
"koa2-formidable": "^1.0.2"
"form-data": "^3.0.0"

入口文件:

app.js

const bodyParser = require('koa-bodyparser');
const formidable = require('koa2-formidable');

app.use (formidable ({}))
// 配置ctx.body解析中间件,必须放在route前
app.use(bodyParser({
  enableTypes: ['json', 'form', 'text'],
  extendTypes: {
    text: ['text/xml', 'application/xml']
  }
}));

...

进行接口转发的地方代码如下:

upload.js

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

async function upload (ctx) {
    const form = new FormData();
    const file = ctx.request.files.file; // 这里就是经过formidable中间件处理后可以直接拿到的内容,假设前端传过来的formData文件参数名字为'file'
    form.append('smfile', fs.createReadStream(file.path)) // 这里就跟前端一样自己拼凑formData,区别是文件以文件流的方式传进去
    
    // 这里使用了axios来进行接口请求,可能是我使用方式不对,使用node-request包进行formData处理的时候一直保存,找不到原因,最后换成axios就可以了
    const r = await axios({
        method: "post",
        url: "https://example/api/upload",
        data: form,
        headers: { ...form.getHeaders() }
      });
      
      //之后就是正常接口返回了
}

exports.upload = upload

今天我也遇到楼主一样的问题,贴下我的解决方案,如果前端请求参数和最终上传接口的参数一样的话可以直接使用ctx.req.pipe的方式传递前端传过来的参数,这样就不需要使用其他任何处理:

const request = require('request');
router.post('/upload', async (ctx) => {
  const res = await ctx.req.pipe(request.post(`https://example.com`)) // 这里请求真正的接口
  ctx.body = res
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文