使用 Swagger(v3;yaml)多方表单数据和Node.js(后端)进行文件上传



问题:为什么这个节点.js上传文件代码适用于 jade,但在使用 swagger 时则不行?

我一直在试图弄清楚如何使用 swagger (yaml(、多方、表单数据和 nodejs 上传文件。

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

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

演示说明过时但不错的演示
应用程序

当前端为 Jade 时,nodejs 代码按预期工作。但是,form.parser(req( 在使用 swagger API 时似乎失败了。原因似乎是因为数据位于请求中的不同位置。成功后,数据似乎位于 req._readableState.pipes 中。使用 swagger 时,数据似乎位于 req.swagger.params 中。

我不知道我是否应该将数据移动到 req._readableState.pipes 中,或者是否有不同的解析器应该用于招摇的参数(或者其他东西可能搞砸了(。

//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 code(

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

找到了一个解决方案。这可能不是最好的方法...但这是一种将文件提升到 Azure Blob 存储的方法。使用 multer 而不是多方。这是没有任何(最小(错误检查或加密的基本知识。有multer-azure和multer-azure-storage,我计划研究一下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 code ...后端(

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 code ...后端(

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

//angularFile.js (angular-javascript code ...前端(

$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.";
});
}

最新更新