如何使用swagger-express-mw上传文件并表达?

时间:2017-07-30 10:43:40

标签: node.js express swagger

我想使用express框架上传多部分表单数据。我正在使用swagger-node表达我的API。现在,我已经在swagger YAML文件中写了以下文件来上传文件:

  /picture/students:
    # binds a127 app logic to a route
    x-swagger-router-controller: bus_api
    post:
      description: Upload a picture
      # used as the method name of the controller
      operationId: uploadStudentPic
      consumes:
        - multipart/form-data
      parameters:
       - in: formData
         name: imageFile
         type: file
         description: The file to upload.
         required: true
      responses:
        "200":
          description: OK
          schema:
            # a pointer to a definition
            $ref: "#/definitions/SuccessResponseStr"

但现在我不知道如何使用它上传图片。是否有任何内置设施可以上传图片?

1 个答案:

答案 0 :(得分:0)

尽管这是一个老问题,但是您如何才能做到这一点。我们在这里使用express-fileupload npm模块,这使我们的生活更轻松。下面是一个简单的片段,用于将文件上传并保存到我们的服务器中,摇摇欲坠的Yaml保持不变。

 //import the module
 const fileUpload = require('express-fileupload');

 // Add this in express setup 
 app.use(fileUpload());

 // Your controller function, where you will get the file and store it as needed
 function uploadStudentPic(req: any, res: any, next: any) {

   var startup_image = req.files.imageFile;
   var fileName = startup_image.name;

   startup_image.mv(__dirname + '/images/' + fileName, function (err: any) {
     if (err) {
       res.status(500).send(err);
     }
     res.json({
       "message": "File Uploaded"
     });
   });
 }
  

注意:上面的代码仅用于一个简单的用例,您可能需要做一些   根据您的要求进行更多配置。如果你只是想   上传文件并将其存储在服务器上应该可以。


这里需要注意的重要一点是,swagger不必知道我们正在使用哪个模块,或者swagger也不必提供内置的工具来上传图像。

我们在声明API时正在做的事情,更具体地说是这些行...

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

...指定上述POST API需要一个名为imageFile的参数,该参数应该是文件,并且是该API起作用所必需的。而且,如果您在express&swagger-node配置中启用了swagger验证器中间件,我们的API将验证传入的请求,并在未上传文件的情况下以400 Bad Request错误作为响应。

如果您要使用敏捷的中间件配置swagger-nodeswagger-tools的示例配置,可以在我发布的this answer中找到一些详细信息(不好意思公开:P)