Estoy tratando de descargar un archivo de Excel y luego cargarlo en Azure Blob Storage para usarlo en Azure Data Factory. Tengo un javascript de dramaturgo que funcionó cuando el archivo era .csv, pero cuando pruebo el mismo código con un archivo de Excel, no se abre en Excel. Dice: "Encontramos un problema con algún contenido en 'order_copy.xlsx'. ¿Quiere que intentemos recuperar tanto como podamos?: Después de hacer clic en Sí, dice: "Excel no puede abrir el archivo 'order_copy.xlsx'. ' porque el formato o la extensión del archivo no es válido. Verifique que el archivo no se haya dañado y que la extensión del archivo coincida con el formato del archivo".
¿Alguna idea sobre cómo usar createReadStream de manera más efectiva para hacer esto y preservar el formato .xlsx?
No creo que el método saveAs funcione, ya que este código se ejecuta en una función de Azure sin acceso a una ruta local conocida.
Lo primero que pensé fue que el tipo de contenido no era el correcto, así que lo configuré, pero aún así no funcionó. Probé un codificador UTF-8 pero tampoco funcionó.
//const data = await streamToText(download_csv.createReadStream()) const download_reader = await download_csv.createReadStream(); let data = ''; for await (const chunk of download_reader) { data += chunk; //---I suspect I need to do something different here } // const data_utf8 = utf8.encode(data) //unescape( encodeURIComponent(data) ); const AZURE_STORAGE_CONNECTION_STRING = "..." //---Removed string here // Create the BlobServiceClient object which will be used to create a container client const blob_service_client = BlobServiceClient.fromConnectionString(AZURE_STORAGE_CONNECTION_STRING); // Get a reference to a container const container_client = blob_service_client.getContainerClient('order'); const blob_name = 'order_copy.xlsx'; // Get a block blob client const block_blob_client = container_client.getBlockBlobClient(blob_name); const contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' const blobOptions = { blobHTTPHeaders: { blobContentType: contentType } }; //const uploadBlobResponse = await block_blob_client.upload(data_utf8, data_utf8.length, blobOptions); const uploadBlobResponse = await block_blob_client.upload(data, data.length, blobOptions); console.log("Blob was uploaded successfully. requestId: ", uploadBlobResponse.requestId);Cualquier orientación sería apreciada. ¡Gracias de antemano por su ayuda!
-Chad
Gracias @Gaurav por la sugerencia de no configurar los datos en una cadena. El siguiente código funcionó después de que cambié a usar una matriz de fragmentos y lo concatené usando el búfer similar al código sugerido.
let chunks = [] for await (const chunk of download_reader) { chunks.push(chunk) } const fileBuffer = Buffer.concat(chunks) ... const uploadBlobResponse = await block_blob_client.upload(fileBuffer, fileBuffer.length, blobOptions);¡Gracias a todos!