2016-03-18 52 views
1

这里是POST请求JSON的NodeJS上传的base64图像天青Blob存储结果“ResourceNotFound”错误

{ 
    "name":"images.jpg", 
    "file":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxQTEhIUEhIUFBUV…K9rk8hCAEkjFMUYiEAI+nHIpsQh0AkisDYRTOiCAbWVtgCtI6IlkHh7LDTQXLH0EIQBj//2Q==" 
} 

和这里的请求/upload路线下我的节点控制器,我使用createBlockBlobFromText()azure-storage

var azure = require('azure-storage'); 
var blobSvc = azure.createBlobService('myblob.blob.core.windows.net/mycontainer', THE_KEY); 

controllers.upload = function (req, res, next){ 

    var startDate = new Date(); 
    var expiryDate = new Date(startDate); 

    var sharedAccessPolicy = { 
     AccessPolicy: { 
      Permissions: azure.BlobUtilities.SharedAccessPermissions.WRITE, 
      Start: startDate, 
      Expiry: expiryDate 
     } 
    }; 

    var sharedAccessSignatureToken = blobSvc.generateSharedAccessSignature('resources', req.body.file, sharedAccessPolicy); 
    var sharedBlobService = azure.createBlobServiceWithSas(blobSvc.host.primaryHost + '/' + 'mycontainer' + '?' + sharedAccessSignatureToken); 

    sharedBlobService.createBlockBlobFromText('mycontainer', req.body.name, req.body.file, function(error, result, response) { 
     if (error) { 
      res.send(error); 
      return; 
     } 
     res.send(result); 
    }); 

} 

但是我收到此错误。

{ 
    "code": "ResourceNotFound", 
    "statusCode": 404, 
    "requestId": "bffa6099-0001-000b-53f9-80d18a000000" 
} 
+0

一个明显的问题:是否容器存在于您的存储帐户? –

+0

@GauravMantri是的,它确实是100%以上。 – CENT1PEDE

+0

@GauravMantri我把''data:image/jpeg ...“''传递给'createBlockBlobFromText()'函数的图像格式是正确的吗? – CENT1PEDE

回答

3

情侣变化的需要:

  • 有效期应比开始日期。
  • 共享访问签名应使用相同的容器名称。
  • 共享访问签名应该以文件名传递,而不是文件内容。

这些更改后,代码将类似于此:

var sharedAccessSignatureToken = blobSvc.generateSharedAccessSignature('mycontainer', req.body.name, sharedAccessPolicy); 
var sharedBlobService = azure.createBlobServiceWithSas(blobSvc.host, sharedAccessSignatureToken); 

sharedBlobService.createBlockBlobFromText('mycontainer', req.body.name, req.body.file, function(error, result, response) { 
     if (error) { 
      res.send(error); 
      return; 
     } 
     res.send(result); 
    }); 
+1

Mine的答案是完全正确的,但实际上根本不需要使用开始日期。如果没有设置,服务会检查日期是否在期满之前,看起来像你想要的。如果使用开始日期,则如果计算机与存储服务器之间存在时钟偏差,则也可能导致SAS无法立即工作的问题。 –