2017-08-10 9 views
0

質問:このnode.jsアップロードファイルコードはjadeで動作しますが、swaggerを使用すると動作しません。ファイルアップロードのためにswagger(v3; yaml)multipartyフォームデータとnode.js(バックエンド)を使用

私はswagger(yaml)、multiparty、form-data、nodejsを使ってファイルをアップロードする方法を解明しようとしています。

私はこのウェブサイトからファイルをアップロードする方法についてnodejsコード例を見つけました: https://github.com/pillarjs/multiparty/blob/master/examples/azureblobstorage.js

また、サンプルと一緒に(プロジェクト(nodejsに似ては、上記のgithubのリンクにcodefound)もここで見つけることができnodejsプロジェクト):フロントエンドはヒスイであるとき、予想通り

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

nodejsコードが動作します。しかし、swagger APIを使用するとform.parser(req)が失敗するようです。その理由は、データがreq内の別の場所に配置されているためです。成功すると、データはreq._readableState.pipesに格納されているようです。 swaggerを使用すると、データはreq.swagger.paramsに格納されているようです。

私はデータをreq._readableState.pipesに移動することになっているのかどうかわかりません。また、スガーガーのパラメータに使用する必要がある別のパーサーがあるかどうかは分かりません。 (コードnodejs)

// swagger.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溶液実測

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'); 
} 

答えて

0

。これは最善の方法ではないかもしれませんが、ファイルを空白のブロブストレージに取得する方法です。 multipartyの代わりにmulterを使用する。これは、最小限のエラーチェックや暗号化が行われていない基本的な基本です。 //紺碧-multerとmulter-紺碧-ストレージ私もmulter-azureを検討する予定、 multer-azure-storage

// swagger.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); 
    } 
    }); 
} 

// app.js(nodejs-javascriptのコード...バックエンド)

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

// angularFile.js(角-javascriptのコード...フロントエンド)

$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."; 
    }); 
} 
関連する問題