2017-08-10 314 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."; 
    }); 
} 
相关问题