Swagger NodeJS 文件上传

Swagger NodeJS File Upload

解法: 在我的 swagger 合同中有一个错误,文件上传的正确定义应该是这样的:

  parameters:
   - in: formData
     name: file
     description: The file to upload
     required: true
     type: file

谢谢指点!

原题:

我的 Swagger/NodeJS API.

有问题

我想接收文件上传并将检索到的文件存储在另一个云服务中。

遗憾的是,文件没有以我期望的格式到达。 这是我通过邮递员在 req.swagger.params.image.value 收到的:

    ------WebKitFormBoundaryZCFoUQnf4lHIhzjj
Content-Disposition: form-data; name="image"; filename="r14kvzvmsh3xnuyl2vq8.png"
Content-Type: image/png

�PNG

IHD�o&�IDA�c���?� � ��1��X��5�юIEND�B`�
------WebKitFormBoundaryZCFoUQnf4lHIhzjj--

测试图像as a PNG 或 base64:

iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==

我的图片 cloudprovider 是 cloudinary,所以当我使用以下代码时,它已成功保存到服务中。

cloudinary.v2.uploader.upload("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")

当我使用

new Buffer(req.swagger.params.image.value, 'binary').toString('base64');

我预计文件会转换为 base64,但我认为请求中定义 Content-Type 等的部分也已转换。

有人知道使用 fileuploads 和 swagger 的方法,这样我就可以将图像成功上传到 cloudinary 了吗?

正则表达式看起来很 "hacky"...

这是我的 swagger 合约中的图片上传部分:

/imageUpload:
x-swagger-router-controller: image_upload
post:
  description: Endpoint to upload the image file. The image has to be uploaded before the shipment is created, a response will be the image ID that has to be supplied to the shipment. If the image ID is not valid, i.e. not known to this api, the shipment can not be created
  operationId: storeImage
  consumes:
    - multipart/form-data
    - application/x-www-form-urlencoded
    - binary
  parameters:
   - in: body
     name: image
     description: The file to upload
     required: true
     schema:
        type: string
        format: file
  responses:
    "200":
      description: Success
      schema:
        # a pointer to a definition
        $ref: "#/definitions/ImageResponse"
    # responses may fall through to errors
    default:
      description: Error
      schema:
        $ref: "#/definitions/ErrorResponse"

在我看来,您上传的是原始二进制图像,而不是 base64 编码图像。我会去掉所有二进制内容,在你的 swagger 文档中只定义 base64,并确保 Buffer->base64 编码按预期工作(做一些控制台日志记录)。

2021 年更新:

Swagger 不允许使用上述方法上传文件。 consumes 字段不再存在。

新版本是这样的:

  requestBody:
    content:
      multipart/form-data:
        schema:
          type: object
          properties:
            fileName:
              type: string
              format: binary