最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

NodeJS 服务器端

网站源码admin25浏览0评论

NodeJS 服务器端

NodeJS 服务器端

从 NodeJs 服务器端上传文件时遇到问题,找到了 100 个帖子并进行了研究,但没有任何效果,将不胜感激。

应用程序的结构

  1. Front App - React Admin 框架接收文件,我在 base64 中编码图像的内容以发送到 API

  2. 后端 - NestJS 应用程序 - 在 API 中接收 base64 图像

  3. 从我的后端 API 需要将文件发送到外部后端(Python API)进行上传 - 这就是问题所在

请看下面我的代码,JS文件有问题

我尝试了几种方法,但都以同样的错误结束

1 解决方案

  • 在缓冲区中转换base64图像并发送到外部后端上传文件
  • 也尝试通过 cleanImageBuffer 但没有变化
import axios from 'axios';
import FormData from 'form-data';

export async function upload(
  fileBase64: string,
  filename: string
): Promise<any> {

  const buffer = Buffer.from(fileBase64, 'base64')
  const extension = fileBase64.substring(fileBase64.indexOf('/') + 1, fileBase64.indexOf(";base64"))
  const cleanBase64 = fileBase64.replace(/^data:image\/png;base64,/, '')
  const cleanImageBuffer = Buffer.from(cleanBase64, 'base64')

  const formData = new FormData();
  // have tried to pass as well cleanImageBuffer but no changes
  formData.append('file', buffer);
  formData.append('fileName', filename + '.' + extension);
  formData.append('namespace', 'test');
  
  return await axios
    .post('external_api_url', JSON.stringify(formData), {
      headers: {
        Authorization: `Bearer token`,
        ContentType: 'multipart/form-data'
      }
    })
    .then((response) => {
      console.log('response = ' + JSON.stringify(response))
    })

结果1解决方案

{
    "status": "error",
    "error": {
        "code": "bad_request",
        "message": "file Expected UploadFile, received: <class 'str'>"
    }
}

2 解决方案

  • 从 base64 图像收到保存在我的磁盘上
  • 创建流并发送图像后
export async function upload (
  fileBase64: string,
  filename: string
): Promise<any> {

  const extension = fileBase64.substring(fileBase64.indexOf('/') + 1, fileBase64.indexOf(";base64"))
  const cleanBase64 = fileBase64.replace(/^data:image\/png;base64,/, '')

  const TMP_UPLOAD_PATH = '/tmp'

  if (!fs.existsSync(TMP_UPLOAD_PATH)) {
    fs.mkdirSync(TMP_UPLOAD_PATH);
  }

  fs.writeFile(TMP_UPLOAD_PATH + '/' + filename + '.' + extension, cleanBase64, 'base64', function(err) {
    console.log(err);
  })

  const fileStream = fs.createReadStream(TMP_UPLOAD_PATH + '/' + filename + '.' + extension)

  const formData = new FormData();
  formData.append('file', fileStream, filename + '.' + extension);
  formData.append('fileName', filename + '.' + extension);
  formData.append('namespace', 'test');

  return await axios
    .post('external_api_url', formData, {
      headers: {
        Authorization: `Bearer token`,
        ContentType: 'multipart/form-data'
      }
    })
    .then((response) => {
      console.log('response = ' + JSON.stringify(response))
    })
}

结果2解决方案

{
    "status": "error",
    "error": {
        "code": "bad_request",
        "message": "file Expected UploadFile, received: <class 'str'>"
    }
}

以相同结果结束的其他解决方案

  • 尝试使用从节点获取中获取 - 结果相同
  • 发现有些人使用的 axios 版本过时并遇到此问题,我安装了最新的 axios 1.1.3 版本但结果相同

我需要的最佳场景

  • 从接收到的base64图像
  • 在缓冲区中转换并将文件发送到外部 Python API,以避免将文件保存在本地磁盘上

将不胜感激

下面是一个有效但不是 JS 的 python 示例(JS 无效)

import requests

url = "http://127.0.0.1:8000/external_api"

payload={'namespace': 'test'}
files=[
  ('file',('lbl-pic.png',open('/local/path/lbl-pic.png','rb'),'image/png'))
]
headers = {
  'Authorization': 'Bearer token'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)
回答如下:

只是一个建议:

  • 这里有一行返回提到的错误https://github/tiangolo/fastapi/blob/41735d2de9afbb2c01541d0f3052c718cb9f4f30/fastapi/datastructures.py#L20,你可能会发现它很有用。
  1. 首先看看您是否可以使用常规 HTML 文件输入(不要使 Base64 复杂化),如此处所述https://stackoverflow/a/70824288/2347084
  2. 如果 (1) 有效,则尝试按照此处的建议将 base64 转换为 File 对象https://stackoverflow/a/47497249/2347084
  3. 结合(2)和(1)

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论