Azure Blob存储
我一直在尝试使用请求模块和Azure存储模块异步将Blob映像发送到REST Api。我不想将Blob下载到本地文件,然后从本地文件创建可读流,因为它不具备性能。这是我尝试过的,但它抛出错误“MIME多部分流的意外结束.MIME多部分消息未完成。”从请求文档中,在表单数据中发送文件需要您传递可读流。似乎Azure存储客户端的可读流与请求模块的格式不兼容。任何想法如何让这个工作?
const request = require('request');
const storage = require('azure-storage');
const blobService = storage.createBlobService(process.env.AzureWebJobsStorage);
let stream = blobService.createReadStream(
containerName,
blobName,
function(err, res) {
});
let formData = {
rootMessageId: messageId,
file: stream
};
request.post({
url:'https://host-name/Api/comment',
headers: {'Authorization': `Token ${authToken}`},
formData: formData
}, (err, res, body) => {
console.log(res)
}
});
回答如下:
我试图使用你的代码将图像blob上传到我的所有者本地url http://localhost/upload
,然后我发现你的file
的formData
属性中缺少一些属性。
这是我的代码作品。
const request = require('request');
const storage = require('azure-storage');
var accountName = '<your storage account name>';
var accountKey = '<your storage account name>';
var blobService = storage.createBlobService(accountName, accountKey);
let stream = blobService.createReadStream(containerName, blobName, function(err, res){
formdata.file.options.contentType = res.contentSettings.contentType;
console.log(formdata);
});
var formdata = {
rootMessageId: messageId,
file: { // missing some properties
value: stream,
options: {
filename: function(blobName) {
var elems = blobName.split('/');
return elems[elems.length-1];
}(blobName),
knownLength: stream // a required property of `file` is `knownLength` which will cause server error if be missed.
},
}
}
request.post({
url: 'https://host-name/Api/comment', // I used my url `http://localhost/upload` at here
headers: {'Authorization': `Token ${authToken}`}, // I used a empty {} as header at here
formData: formdata
}, (err, res, body) => {
console.log(res)
}
});
考虑到上面的代码,它必须将下载流传输到上传流,并且所有数据也需要流经您的webapp机器。根据我的经验,我认为您可以生成blob的SAS URL以发布到REST API,然后如果您可以更改REST应用程序服务器的代码,则通过REST服务器下载blob。
Azure Blob存储
我一直在尝试使用请求模块和Azure存储模块异步将Blob映像发送到REST Api。我不想将Blob下载到本地文件,然后从本地文件创建可读流,因为它不具备性能。这是我尝试过的,但它抛出错误“MIME多部分流的意外结束.MIME多部分消息未完成。”从请求文档中,在表单数据中发送文件需要您传递可读流。似乎Azure存储客户端的可读流与请求模块的格式不兼容。任何想法如何让这个工作?
const request = require('request');
const storage = require('azure-storage');
const blobService = storage.createBlobService(process.env.AzureWebJobsStorage);
let stream = blobService.createReadStream(
containerName,
blobName,
function(err, res) {
});
let formData = {
rootMessageId: messageId,
file: stream
};
request.post({
url:'https://host-name/Api/comment',
headers: {'Authorization': `Token ${authToken}`},
formData: formData
}, (err, res, body) => {
console.log(res)
}
});
回答如下:
我试图使用你的代码将图像blob上传到我的所有者本地url http://localhost/upload
,然后我发现你的file
的formData
属性中缺少一些属性。
这是我的代码作品。
const request = require('request');
const storage = require('azure-storage');
var accountName = '<your storage account name>';
var accountKey = '<your storage account name>';
var blobService = storage.createBlobService(accountName, accountKey);
let stream = blobService.createReadStream(containerName, blobName, function(err, res){
formdata.file.options.contentType = res.contentSettings.contentType;
console.log(formdata);
});
var formdata = {
rootMessageId: messageId,
file: { // missing some properties
value: stream,
options: {
filename: function(blobName) {
var elems = blobName.split('/');
return elems[elems.length-1];
}(blobName),
knownLength: stream // a required property of `file` is `knownLength` which will cause server error if be missed.
},
}
}
request.post({
url: 'https://host-name/Api/comment', // I used my url `http://localhost/upload` at here
headers: {'Authorization': `Token ${authToken}`}, // I used a empty {} as header at here
formData: formdata
}, (err, res, body) => {
console.log(res)
}
});
考虑到上面的代码,它必须将下载流传输到上传流,并且所有数据也需要流经您的webapp机器。根据我的经验,我认为您可以生成blob的SAS URL以发布到REST API,然后如果您可以更改REST应用程序服务器的代码,则通过REST服务器下载blob。