1

Я хочу загрузить изображение профиля пользователя, отправленного из веб-приложения и мобильного приложения через форму Base64.Nodejs upload base64 image to azure blob storage using .createBlockBlobFromLocalFile()

На запрос POST им необходимо отправить JSON на корпус, который выглядит примерно так.

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

Теперь на стороне сервера с помощью Node и Express, я использовал этот НПМ модуль под названием azure-storage, который предлагает хороший способ загрузки файлов на лазурном хранения больших двоичных объектов с помощью веб-сервиса.

Но есть кое-что, что я не могу понять по этому поводу. Вот часть кода моего контроллера. Я успешно создан все необходимое соединение и ключи и этажерку создать рабочую blobService:

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

    // ... 
    // generated some sastoken up here 
    // etc. 
    // ... 

    var uploadOptions = { 
     container: 'mycontainer', 
     blob: req.body.name, // im not sure about this 
     path: req.body.file // im not sure about this either 
    } 

    sharedBlobService.createBlockBlobFromLocalFile(uploadOptions.container, uploadOptions.blob, uploadOptions.path, function(error, result, response) { 
     if (error) { 
      res.send(error); 
     } 
     console.log("result", result); 
     console.log("response", response); 
    }); 
} 

Im получаю эту ошибку:

{ 
    "errno": 34, 
    "code": "ENOENT", 
    "path": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAAB..." 
} 

ответ

1

В этом случае вы не должны использовать createBlockBlobFromLocalFile. Вместо этого вы должны использовать createBlockBlobFromText, потому что вы не загружаете локальный файл, а контент в тело запроса.

Вот код:

var uploadOptions = { 
    container: 'mycontainer', 
    blob: req.body.name, 
    text: req.body.file 
} 

sharedBlobService.createBlockBlobFromText(uploadOptions.container, 
              uploadOptions.blob, 
              uploadOptions.text, 
         { 
         contentType: 'image/jpeg', 
         contentEncoding: 'base64' 
         }, 
         function(error, result, response) { 
          if (error) { 
           res.send(error); 
          } 
          console.log("result", result); 
          console.log("response", response); 
         }); 

blob только имя файла, который «Профиль-ПИК-123.jpg» этот случай, и path является локальный путь к файлу. Поскольку вы не храните файл локально на стороне сервера, path не имеет смысла в этом случае.

Если Вам необходима дополнительная информация о хранении см this и this

+0

Будет ли это загрузить реальное изображение в лазурной хранения больших двоичных объектов? Скажем, если я перейду на страницу https: // myblob.blob.azure.something.net/mycontainer/theimageiuploaded.jpg, я получу визуальное изображение или только текстовую форму? – CENT1PEDE

+0

, в этом случае это должно быть 'https: // myblob.blob.core.windows.net/mycontainer/profile-pic-123.jpg. Если ваш контейнер является общедоступным, вы можете получить каталог изображений с этого URL-адреса. Если это личное, для получения изображения требуется авторизация. –

+0

Я использовал этот код теперь им получать эту ошибку { "код": "ResourceNotFound", "StatusCode": 404, "RequestID": "bc789061-0001-0022-37f3-80a7c8000000" } – CENT1PEDE