Azure Blob Storage出现哈希不匹配(完整性检查失败)的问题

3
我正在参照http://willi.am/blog/2014/07/03/azure-blob-storage-and-node-downloading-blobs/的示例。但是,尽管使用了完全相同的代码,当我下载blob时,Azure会报错:
[Error: Hash mismatch (integrity check failed), Expected value is ...]
运行的行是 blobService.getBlobToText,blobService是连接Azure的对象(createBlobService...)。这是怎么回事? :S
以下是我的代码:
    // Azure test
    function downloadImageAsText(blobService, containerName, blobName) {

         blobService.getBlobToText(
              containerName,
              blobName,
              function(err, blobContent, blob) {
                  if (err) {
                      console.error("Couldn't download blob %s", blobName);
                      console.error(err);
                  } else {
                      console.log("Sucessfully downloaded blob %s", blobName);
                      console.log(blobContent);
                  }
              });

    }

    function uploadImage(blobService, containerName, blobName, fileName) {

      blobService.getBlobProperties(
        containerName,
        blobName,
        function(err, properties, status) {
            if (status.isSuccessful) {
                // Blob exists
            } else {
                blobService.createBlockBlobFromLocalFile(
                    containerName,
                    blobName,
                    fileName,
                    function(error, result, response){
                        if(error){
                            console.log("Couldn't upload file %s", fileName);
                            console.error(error);
                        } else {
                            console.log('File %s uploaded successfully', fileName);
                            downloadImageAsText(blobService, containerName, blobName);
                        }
                    });
            }
        });
    }


    function testAzure() {

      accountName / hash = my details

      var storage = require('azure-storage');
      var blobService = storage.createBlobService(accountName, hash);
      var containerName = 'tst';
      var blobName = 'test.png';
      var fileName = 'test.png';

      blobService.createContainerIfNotExists(containerName, function(err, result, response) {
          if (err) {
              console.log("Couldn't create container %s", containerName);
              console.error(err);
          } else {
              if (result) {
                  console.log('Container %s created', containerName);
                  uploadImage(blobService, containerName, blobName, fileName);
              } else {
                  console.log('Container %s already exists', containerName);
                  uploadImage(blobService, containerName, blobName, fileName);
              }
          }
      });
    }

    function startServer() {
      http = require('http');
      const PORT = 8080;
      var server = http.createServer(handleRequest);
      server.on('listening',function(){
        console.log("Server listening on: http://178.62.117.207:%s", PORT);
      });
      server.listen(PORT);
    }

    startServer();
    testAzure();
5个回答

6
如果有其他人遇到这种情况,这是因为您存储了一个 Buffer 对象,但检索到了一个 string

有什么想法怎么处理这个? - user6269864
@K48 如果我没记错的话,你是将一个 Buffer 存储在 blob 中,但是却使用 getBlobToText 将该数据作为 String 检索出来。由于两种类型之间哈希计算的原因不同,所以操作失败了。 - lionello

2
尝试像下面这样做(修改您提到的博客文章中的代码):
var blobName = 'my-awesome-text-blob';
blobService.getBlobToText(
    containerName,
    blobName, {'disableContentMD5Validation': true },
    function(err, blobContent, blob) {
        if (err) {
            console.error("Couldn't download blob %s", blobName);
            console.error(err);
        } else {
            console.log("Sucessfully downloaded blob %s", blobName);
            console.log(blobContent);
        }
    });

看看这个是否有帮助。

现在出现了错误: 错误:从连接中读取了不正确的字节数。该连接可能已经关闭。 - Jordan Thomas
我认为这个错误是由于内容长度不匹配引起的。你的文档中包含重音字符吗?这可能与你的问题有关:https://github.com/azure-contrib/node-azure-search/issues/4? - Gaurav Mantri
嗯...不太确定。这是一个图像文件,test.png,我想获取其内容以便在GET请求中发送它 - 也许代表图像数据的字符会使Azure出现问题? - Jordan Thomas
1
如果它是一张图片,为什么要将其下载为文本?更好的函数应该是 getBlobToStream:https://github.com/Azure/azure-storage-node/blob/master/lib/services/blob/blobservice.js#L1659 在我看来。 - Gaurav Mantri
1
或者,如果您需要在上传图像时使用文本,请将其转换为Base64编码字符串,然后上传该字符串而不是二进制数据。 - Gaurav Mantri
1
感谢所有的帮助 - 我将尝试使用 getBlobToStream 并进行操作。仍然觉得 toText 函数不起作用很奇怪,可能是它出了问题,需要微软修复,或者他们需要更好的错误处理,因为我收到的错误信息几乎没有用。 :P - Jordan Thomas

1
当您存储一个Buffer对象时,您可以使用getBlobToStream检索它。
const data: Buffer[] = [];
const stream = new PassThrough();

stream.on('data', (d: Buffer) => {
    data.push(d);
});

this.blobStorageContext.service.getBlobToStream(
    this.blobStorageContext.getContainerName(),
     blobName, stream, (error) => {
         if (error) {
           console.log(error);
         } else { 
           console.log(Buffer.concat(data));
         }
});

1

然而,在文档中,他们将Blob下载到服务器。这对我也有用 - 不起作用的是getBlobToText,它被提及但没有演示。 - Jordan Thomas

0

我最近也遇到了这个问题。不知何故,npm -install azure-storage -g 命令解决了它。可能是因为该包已在npm上更新,而md5计算方式也发生了变化。一旦我更新了azure-storage包,一切都像魔法般地正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接