Node.js Azure功能:以流的形式从存储中下载图像并再次上载
我正在nodeJS中使用azure函数。最初我想下载一个图像作为缓冲区,将其添加到我的zip文件(使用adm-zip),然后再次上传。但是,解压缩后无法显示图像。为了下载图像,我使用了Node.js Azure功能:以流的形式从存储中下载图像并再次上载,node.js,azure,stream,azure-functions,Node.js,Azure,Stream,Azure Functions,我正在nodeJS中使用azure函数。最初我想下载一个图像作为缓冲区,将其添加到我的zip文件(使用adm-zip),然后再次上传。但是,解压缩后无法显示图像。为了下载图像,我使用了createReadStream,然后从流中分配了一个缓冲区,然后将其添加到zip中,保存了zip并使用createBlobFromText上传。这里的其他一切都很好,我尝试添加了一个test.txt,这是正常添加的。所以我的图像流肯定有问题 所以我试着下载img作为缓冲区,然后直接将它再次上传到我的存储器中。结果
createReadStream
,然后从流中分配了一个缓冲区,然后将其添加到zip中,保存了zip并使用createBlobFromText
上传。这里的其他一切都很好,我尝试添加了一个test.txt
,这是正常添加的。所以我的图像流肯定有问题
所以我试着下载img作为缓冲区,然后直接将它再次上传到我的存储器中。结果,图像被破坏,无法打开。要下载图像,我使用createReadStream
。然后使用流分配缓冲区,然后使用createBlockBlobFromText
上载缓冲区
所以我的问题是,我处理带有图像的流是否错误?
是否有更好的方法获取图像并继续使用它?
谢谢
这是我的邮政编码:
const storage = require('azure-storage');
const STORAGE_ACCOUNT_NAME = 'something';
const ACCOUNT_ACCESS_KEY = 'somekey';
let AdmZip = require('adm-zip');
const blobService = storage.createBlobService(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
var container = 'container';
var file = 'powerpoint.pptx';
var data = [],
dataLen = 0;
var stream = blobService.createReadStream(container, file);
stream.on('data', (chunk) => {
context.log(`Received ${chunk.length} bytes of data.`);
data.push(chunk);
dataLen += chunk.length;
});
stream.on('end', () => {
getImageAsBuffer(container, 'test-image.png').then((imgBuf) => {
var buf = Buffer.alloc(dataLen);
for (var i = 0, len = data.length, pos = 0; i < len; i++) {
data[i].copy(buf, pos);
pos += data[i].length;
}
var zip = new AdmZip(buf);
zip.deleteFile("/ppt/media/image1.png");
zip.addFile("/ppt/media/image1.png", Buffer.alloc(imgBuf.dataLen, imgBuf.data));
var powerpoint = zip.toBuffer();
uploadRemoteFile(powerpoint, container, 'new-powerpoint.pptx').then((res) => {
context.log('res', res);
context.done();
})
})
});
};
function uploadRemoteFile(buffer, containerName, filename) {
return new Promise((resolve, reject) => {
blobService.createBlockBlobFromText(containerName, filename, buffer, function (err) {
if (err) {
reject(err);
} else {
resolve({
message: 'resolved successfully'
});
}
})
});
}
function getImageAsBuffer(container, file) {
return new Promise((resolve, reject) => {
var imgData = [],
imgLen = 0;
var imgStream = blobService.createReadStream(container, file);
imgStream.on('data', (chunk) => {
imgData.push(chunk);
imgLen += chunk.length;
});
imgStream.on('end', () => {
resolve({
"data": imgData,
"dataLen": imgLen
})
})
})
const-storage=require('azure-storage');
const STORAGE_ACCOUNT_NAME='something';
const ACCOUNT_ACCESS_KEY='somekey';
让AdmZip=require('adm-zip');
const blobService=storage.createBlobService(存储\帐户\名称、帐户\访问\密钥);
module.exports=函数(上下文,请求){
log('JavaScript HTTP触发器函数处理了一个请求');
var container='container';
var文件='powerpoint.pptx';
var数据=[],
dataLen=0;
var stream=blobService.createReadStream(容器、文件);
stream.on('data',(chunk)=>{
log(`Received${chunk.length}字节的数据。`);
数据推送(块);
dataLen+=chunk.length;
});
stream.on('end',()=>{
getImageAsBuffer(容器“test image.png”)。然后((imgBuf)=>{
var buf=Buffer.alloc(dataLen);
对于(变量i=0,len=data.length,pos=0;i{
log('res',res);
context.done();
})
})
});
};
函数uploadRemoteFile(缓冲区、容器名称、文件名){
返回新承诺((解决、拒绝)=>{
createBlockBlobFromText(容器名称、文件名、缓冲区、函数(错误){
如果(错误){
拒绝(错误);
}否则{
决心({
消息:“已成功解决”
});
}
})
});
}
函数getImageAsBuffer(容器、文件){
返回新承诺((解决、拒绝)=>{
var imgData=[],
imgLen=0;
var imgStream=blobService.createReadStream(容器、文件);
imgStream.on('data',(chunk)=>{
imgData.push(块);
imgLen+=chunk.length;
});
imgStream.on('end',()=>{
决心({
“数据”:imgData,
“dataLen”:伊姆格伦
})
})
})
}我在您的代码中看到的一个问题是,您正在使用
createBlockBlobFromText
方法上载二进制内容。您需要使用createBlockBlobFromStream
方法
您可以执行以下操作:
const stream = require('stream');
function uploadRemoteFile(buffer, containerName, filename) {
return new Promise((resolve, reject) => {
const bufferStream = new stream.PassThrough({
highWaterMark: buffer.length
});
bufferStream.end(buffer);
blobService.createBlockBlobFromStream(containerName, filename, bufferStream, buffer.length, function (err) {
if (err) {
reject(err);
} else {
resolve({
message: 'resolved successfully'
});
}
})
});
}
关于如何使用node.js从blob下载图像,请参考@test123,这并没有真正涵盖我的任何问题,更多的是关于blob/的公共访问和未经授权。但我有权进入,我得到了障碍,我只是以某种方式打破了它。另外,这个问题不包括让他们进入流,但谢谢:)嘿,谢谢你的回答!快速提问:bufferStream.end(data)中的“数据”来自哪里?哦,好的!我进一步查看了createBlockBlobFromStream()的文档,似乎我需要更多的参数,而不仅仅是文件名、容器和流。这实际上不起作用,似乎缺少流的长度。不知道如何得到它你到底在哪里得到错误?我还编辑了我的答案(添加了buffer.length参数)。你现在能试试吗?谢谢你的帮助!不幸的是,我仍然无法打开图像,仍然出现错误“无法打开文件。它可能已损坏或使用预览无法识别的文件格式”。因此,图像流和处理可能出现错误