Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Azure功能:以流的形式从存储中下载图像并再次上载_Node.js_Azure_Stream_Azure Functions - Fatal编程技术网

Node.js Azure功能:以流的形式从存储中下载图像并再次上载

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作为缓冲区,然后直接将它再次上传到我的存储器中。结果

我正在nodeJS中使用azure函数。最初我想下载一个图像作为缓冲区,将其添加到我的zip文件(使用adm-zip),然后再次上传。但是,解压缩后无法显示图像。为了下载图像,我使用了
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参数)。你现在能试试吗?谢谢你的帮助!不幸的是,我仍然无法打开图像,仍然出现错误“无法打开文件。它可能已损坏或使用预览无法识别的文件格式”。因此,图像流和处理可能出现错误