Nodejs загружает изображение base64 в хранилище больших двоичных объектов Azure, что приводит к ошибке ResourceNotFound

Вот почтовый запрос JSON :

{
    "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"
}

person CENT1PEDE    schedule 18.03.2016    source источник
comment
Один очевидный вопрос: существует ли контейнер в вашей учетной записи хранения?   -  person Gaurav Mantri    schedule 18.03.2016
comment
@GauravMantri Да, я уверен более чем на 100%.   -  person CENT1PEDE    schedule 18.03.2016
comment
@GauravMantri я передаю правильный формат изображения как функцию "data:image/jpeg..." в createBlockBlobFromText()?   -  person CENT1PEDE    schedule 18.03.2016
comment
(Не перед компьютером) можете ли вы попробовать удалить контейнер /my при создании переменной blobSvc?   -  person Gaurav Mantri    schedule 18.03.2016
comment
@GauravMantri все тот же. "code":"ResourceNotFound"   -  person CENT1PEDE    schedule 18.03.2016


Ответы (1)


Необходима пара изменений:

  • дата истечения срока действия должна быть больше даты начала.
  • подпись общего доступа должна использовать то же имя контейнера.
  • Подпись общего доступа должна передаваться в имени файла, а не в содержимом файла.

После этих изменений код будет похож на этот:

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);
    });
person Mine Tanrinian Demir - MSFT    schedule 18.03.2016
comment
Мой ответ совершенно правильный, но на самом деле вам вообще не нужно использовать дату начала. Если он не установлен, служба просто проверит, что дата до истечения срока действия, что выглядит так, как вы хотите. Если вы используете дату начала, это также может вызвать проблемы, когда SAS не работает сразу, если между вашим компьютером и сервером хранения есть расхождение часов. - person Emily Gerner; 19.03.2016