2017-08-10 317 views
0

問題:爲什麼這個node.js上傳文件代碼的時候使用了jade而不是使用swagger?使用swagger(v3; yaml)multiparty form-data和node.js(後端)進行文件上傳

我一直在試圖弄清楚如何使用swagger(yaml),multiparty,form-data和nodejs來上傳文件。

我發現如何從這個網站上傳文件的NodeJS代碼示例: https://github.com/pillarjs/multiparty/blob/master/examples/azureblobstorage.js

此外,的NodeJS項目(類似於上面的github上鍊接的NodeJS codefound)也可以在這裏找到(與樣品一起項目):

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

的代碼的NodeJS按預期工作時前端是玉。然而form.parser(req)在使用swagger API時似乎失敗了。原因似乎是因爲數據位於req中的不同位置。成功時,數據似乎位於req._readableState.pipes中。在使用swagger時,數據似乎位於req.swagger.params中。

我不知道我是否應該將數據移動到req._readableState.pipes中,或者是否有不同的解析器應該用於swagger params(或其他可能會混淆的東西)。

// 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(代碼的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'); 
} 

回答

0

實測值的溶液中。這可能不是最好的方法......但它是一種將文件存儲到Azure Blob存儲的方式。使用多線代替多方。這是沒有任何(最小)錯誤檢查或加密的基礎知識。有multer,Azure和multer-Azure的存儲,我打算看看還有multer-azuremulter-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."; 
    }); 
} 
相關問題