如何使用 NodeJs 代理多个文件上传?

Posted

技术标签:

【中文标题】如何使用 NodeJs 代理多个文件上传?【英文标题】:How to proxy multiple file upload using NodeJs? 【发布时间】:2021-12-25 01:54:50 【问题描述】:

好的,所以我需要代理从我的 express 节点应用程序上传的文件数组到远程 php Api。

理想情况下,我会使用接近 Nginx 代理的东西,因为它与节点具有相同的模块。

如果没有,我会模仿表单重新发送。

您能帮忙找到最好的方法吗?

【问题讨论】:

【参考方案1】:

所以,我没有发现如何代理请求本身,就像 nginx 一样,但至少我想出了如何将请求及其所有数据重定向到不同的源。

所以,这里我们使用 express-fileupload 从 req 中获取文件数据,并使用 form-data 创建表单并发送数据。

import app from '@app';
import  authMw as checkJwtAndAddToRequest  from '@middleware/Auth';
import  Router  from 'express';

import fileupload,  UploadedFile  from "express-fileupload";

import FormData from 'form-data';

//add this MW to add files to you'r req

app.use(checkJwtAndAddToRequest)
app.use(fileupload());

app.post('/upload', (req, res) => 
    const uploadableFiles: UploadedFile[] | UploadedFile | undefined = req.files?.formFieldName;

    if(!uploadableFiles) 
        throw Error('Pls add files to upload them');
    

    //Transorm single file to same form as an array of files
    const files: UploadedFile[] = Array.isArray(uploadableFiles) ? uploadableFiles : Array<UploadedFile>(uploadableFiles);

    //create form
    const form = new FormData();

    //add files
    files.forEach(
        file => form.append('files[]', file.data.toString(), file.name)
    )

    //Submit 
    form.submit(
        protocol: 'http:',
        host: process.env.API_URL,
        path: '/api-path-for/file/upload',
        method: 'POST',
        headers: 
            //Add auth token if needed
            authorization: `Bearer $String(req.body.jwtToken)`
        
    , (err, response) => 
        if(err) 
            //handle error 
            res.status(503).send('File server is currently unavailable');
        
        //return remote response to original client
        response.pipe(res)
    );
);

【讨论】:

以上是关于如何使用 NodeJs 代理多个文件上传?的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同的上传点在同一页面上上传多个文件。使用 nodejs express-fileupload

如何使用 nodejs / express 上传和读取文件

如何使用 NodeJS 将文件或图像上传到服务器

我们如何使用代理和 NodeJS 从 azure 存储下载 blob?

完成文件上传后,如何使用 nodejs 撤销 Azure 的共享访问签名(SAS)?

如何在nodejs中接收上传的文件