代码之家  ›  专栏  ›  技术社区  ›  Fractal

使用swagger(v3;yaml)多方表单数据和节点。用于文件上载的js(后端)

  •  0
  • Fractal  · 技术社区  · 8 年前

    问:为什么这个节点。js上传文件代码可以与jade一起使用,但在使用swagger时不能?

    我发现了一个关于如何从这个网站上传文件的nodejs代码示例: https://github.com/pillarjs/multiparty/blob/master/examples/azureblobstorage.js

    此外,这里还可以找到nodejs项目(类似于上面github链接中的nodejs代码)(以及一个示例项目):

    description-of-demo
    outdated-but-nice-demo-app

    我不知道是否应该将数据移动到req.\u readableState。管道,或者是否应该为swagger参数使用不同的解析器(或者可能有其他问题)。

    //斯威格·亚马尔

      /azureFileTransfer:
        x-swagger-router-controller: azureFilesController
        post:
          operationId: uploadAzureFile
          description: upload azure file
          # ticket info to be stored : schema: $ref: "#/definitions/azureFileData"
          consumes:
            - multipart/form-data
          parameters:
            - name: azureFileDataParam
              description: the file to be uploaded
              in: formData
              required: false
              type: file
          responses:
            "200":
              description: Success
              schema:
                $ref: "#/definitions/GeneralResponse"
            default:
              description: Error
              schema:
                $ref: "#/definitions/ErrorResponse"
    

    //azureFilesController。js(nodejs代码)

    module.exports = { uploadAzureFile };
    //POST 
    function uploadAzureFile(req, res, next) {
    
      var multiparty = require('multiparty');
    
      var accessKey = '123456storagepassword';
      var storageAccount = 'myblobstorageName';
      var fs = require('fs');
      var container = 'containerwithinblobstorage';
      var blobService = azure.createBlobService(storageAccount, accessKey);
      var form = new multiparty.Form();
    
      form.on('part', function (part) {
        if (part.filename) {
    
          var size = part.byteCount - part.byteOffset;
          var name = part.filename;
    
          blobService.createBlockBlobFromStream(container, name, part, size, function (error) {
            if (error) {
              res.send(' Blob create: error ');
            }
          });
        } else {
          form.handlePart(part);
        }
      });
      form.parse(req); //req.swagger.params.file.value // req
      res.send('OK');
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Fractal    8 年前

    找到了解决方案。这可能不是最好的方法……但这是一种将文件升级到azure blob存储的方法。使用multer而不是多方。这是最基本的,没有任何(最小)错误检查或加密。我还计划研究multer azure和multer azure存储 multer-azure , multer-azure-storage

    //昂首阔步。yaml(yaml…后端))

      /azureFileTransfer:
    x-swagger-router-controller: azureFilesController
    post:
      operationId: uploadAzureFile
      description: upload azure file
      # ticket info to be stored : schema: $ref: "#/definitions/azureFileData"
      consumes:
        - multipart/form-data
      parameters:
        - name: azureFileDataParam
          description: the file to be uploaded
          in: formData
          required: false
          type: file
      responses:
        "200":
          description: Success
          schema:
            $ref: "#/definitions/GeneralResponse"
        default:
          description: Error
          schema:
            $ref: "#/definitions/ErrorResponse"
    

    //azureFilesController。js(nodejs javascript代码…后端)

    module.exports = { uploadAzureFile };
    
    //POST 
    function uploadAzureFile(req, res, next) {
      var azureStorage = require('azure-storage');
      var accessKey = 'keyfor_storageAccount';
      var storageAccount = 'azureBlobStorageName';
      var container = 'nameOfContainerInYourBlobStorage'; 
      var blobService = azureStorage.createBlobService(storageAccount, accessKey);
    
      var file_location = req.files[0].path;
      var file_name = req.files[0].originalname;
      blobService.createBlockBlobFromLocalFile(container, file_name, file_location, function (error, result, response) {
        if (!error) {
          res.sendStatus(200); // file uploaded successfully
        }
        else {
          res.sendStatus(500);
        }
      });
    }
    

    //应用程序。js(nodejs javascript代码…后端)

    var multer = require('multer');
    app.use(multer({ dest: './uploads/' }).any());
    

    $scope.uploadModel = function () {
      var file = $scope.myFile;
      console.log('file is ');
      console.dir(file);
      var base_uri = $scope.traSettingsService.baseUri;
      var uploadUrl = base_uri + 'azureFileTransfer/'; 
      uploadFileToUrl(file, uploadUrl);
    };
    
    function uploadFileToUrl(file, uploadUrl) {
      var testing = null;
      var fd = new FormData();
      fd.append('file', file);
      $http.post(uploadUrl, fd, {
        transformRequest: angular.identity,
        headers: { 'Content-Type': undefined }
      }).then(function successCallback(response) {
        $scope.responseMessage = "Your file was successfully uploaded";
      }, function errorCallback(response) {
        $scope.responseMessage = "The file failed to load. Please try again.";
      });
    }