J'utilise blockBlobURL.download ()
d'Azure pour télécharger une image, mais je ne reçois que la partie supérieure de l'image. Y a-t-il une limite à la quantité que je peux télécharger à partir de l'objet blob Azure vers un flux lisible? La longueur du contenu est 172628 et il existe une propriété highWaterMark: 16384
. Sont-ils liés?
async function compareToBaseline(imageData, blobName, metadata){ const baselineBlobName = "MacOSX10.12/chrome/initial" const containerURL = ContainerURL.fromServiceURL(serviceURL, "baselines") const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, baselineBlobName ); let baseLineImage = await blockBlobURL.download(aborter, 0) baseLineImage = baseLineImage.originalResponse.readableStreamBody.read() console.log(baseLineImage.length); baseLineImage = new Buffer(baseLineImage, 'base64'); await fs.writeFile('./newest.png', baseLineImage, 'binary', function(err){ console.log('written'); }) }
Le résultat n'est que la partie supérieure d'une image.
3 Réponses :
Il semble que ce problème soit similaire avec votre autre fil de discussion Impossible de lire readableStreamBody à partir du blob téléchargé .
Voici ma fonction pour vous aider à enregistrer baseLineImage.readableStreamBody
dans un fichier, comme ci-dessous.
async function compareToBaseline(imageData, blobName, metadata){ const baselineBlobName = "MacOSX10.12/chrome/initial" const containerURL = ContainerURL.fromServiceURL(serviceURL, "baselines"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, baselineBlobName ); let baseLineImage = await blockBlobURL.download(aborter, 0); await streamToFs('./newest.png', baseLineImage.readableStreamBody)ï¼ }
blockBlobURL.download () n'a pas de limite de taille de fichier. Mais read ()
renvoie null ne signifie pas plus de données dans le flux. Vous devez suivre les pratiques de Node.js pour obtenir toutes les données en écoutant l'événement data
ou readable
.
Par exemple, l'événement data
publié par Peter Pan. Ou l'événement lisible
publié par les documents officiels de Node.js:
readable.on('readable', () => { let chunk; while (null !== (chunk = readable.read())) { console.log(`Received ${chunk.length} bytes of data.`); } });
Veuillez toujours appeler read ()
dans un rappel d'événement lisible
.
Je ne peux pas écrire une réponse correcte pour le moment, mais
read ()
ne renvoie qu'un morceau de données, vous devez boucler jusqu'à ce qu'il renvoienull
, voir docsSerais-je capable de boucler sur ces données et de continuer à ajouter les données à une variable et éventuellement d'écrire ces données dans le système de fichiers? Ou aurais-je besoin de le diriger en continu vers le système de fichiers? Si je comprends bien.
Idéalement, vous les dirigeriez vers le système de fichiers au lieu de placer d'abord les données dans une variable, afin de limiter la consommation de mémoire. Dans ce cas, vous n'aurez probablement même pas besoin d'appeler
read ()
dans une boucle, je suppose quefs
prend en charge l'écriture d'un flux directement dans un fichier.read ()
renvoienull
ne signifie pas qu'il n'y a plus de données dans le flux. Vous devez suivre les pratiques de Node.js pour obtenir toutes les données en écoutant l'événementdata
oureadable
. Par exemple,readable.on ('readable', () => {let chunk; while (null! == (chunk = readable.read ())) {console.log (
Received $ { chunk.length} octets de données.);}});