Angular:将从 Azure 检索到的 blob 更改为 csv 并将其保存在本地
Angular: changing retrieved blob from Azure into a csv and save it locally
问题: 我在 Azure blob 存储容器中有一个 csv 文件。我尝试使用 Angular 下载它并将其保存到用户计算机。我可以下载它,但它保存为 .xls 文件而不是 .csv,即使源是 csv。如果我尝试在保存之前将其转换为 csv,则保存的 excel sheet 为空。
目标:我想将其下载为原始 csv,或者在将其保存到本地之前将其从 xls 转换为 csv。
我试过几种方法...这是我的service.ts
private containerClient(): ContainerClient {
return new BlobServiceClient(`https://${this.accountName}.blob.core.windows.net?${this.sas}`).getContainerClient(this.containerName);
}
downloadCSV(handler: (blob: Blob) => void){
const blobClient = this.containerClient().getBlockBlobClient("AGENCIES.csv");
blobClient.download().then(res => {
res.blobBody?.then(blob => {
handler(blob);
});
});
}
async downloadCSVwithConnectionString(handler: (blob: Blob) => void){
const containerClient = this.blobServiceConnectionString.getContainerClient(this.containerName);
await containerClient.getBlockBlobClient("AGENCIES.csv").download().then(res => {
res.blobBody?.then(blob => {
handler(blob);
});
});
}
downloadCSVwithConnectionString2(){
const containerClient = this.blobServiceConnectionString.getContainerClient(this.containerName);
return containerClient.getBlockBlobClient("AGENCIES.csv").download();
}
这是我的 component.ts
import { AzureBlobStorageService } from 'src/app/services/azure-storage/azure-blob-storage.service';
import * as XLSX from 'xlsx';
import * as FileSaver from 'file-saver';
tryDownload1(){
tryDownload1(){
this.azure.downloadCSV(blob => {
let url = window.URL.createObjectURL(blob);
window.open(url);
});
}
tryDownload2(){
this.azure.downloadCSVwithConnectionString(blob => {
let csvData = XLSX.utils.sheet_to_csv(blob);
const data: Blob = new Blob([csvData], { type: 'application/vnd.ms-excel' });
FileSaver.saveAs(data, "CSVFile" + new Date().getTime() + '.csv');
});
}
tryDownload3(){
this.azure.downloadCSVwithConnectionString2().then(res => {
console.log(res);
let csvData = XLSX.utils.sheet_to_csv(res);
console.log(csvData);
const data: Blob = new Blob([csvData], { type: 'text/plain' });
console.log(data);
FileSaver.saveAs(data, "CSVFile" + new Date().getTime() + '.csv');
});
}
注意:我使用了 XLSX,因为我找不到只适用于 xls 的工作包
我在其中一个中添加了一些控制台日志,以尝试确定数据是否正确传输到 csv,但似乎没有。
对于遇到此问题的任何人,以下是我的解决方法...
在存储容器中的 Microsoft Azure 上,我打开了正在下载的文件的属性。我将“CONTENT-TYPE”从“application/vnd.ms-excel”更改为“text/csv”.
我在 service.ts 中使用了相同的“downloadCSV”函数,并在 component.ts 中使用了以下函数。所做的更改是将文件名更改为“AGENCIES.csv”而不是随机的 url 密钥。
constructor(
private azure: AzureBlobStorageService,
@Inject(DOCUMENT) private document: Document,
private elementref: ElementRef,
private render: Renderer2
) { }
tryDownload1(){
this.azure.downloadCSV(blob => {
let url = window.URL.createObjectURL(blob);
let downloadLink = this.document.createElement("a");
downloadLink.href = url;
downloadLink.download = "AGENCIES.csv";
this.render.appendChild(this.elementref.nativeElement, downloadLink);
downloadLink.click();
this.render.removeChild(this.elementref.nativeElement, downloadLink);
});
}
问题: 我在 Azure blob 存储容器中有一个 csv 文件。我尝试使用 Angular 下载它并将其保存到用户计算机。我可以下载它,但它保存为 .xls 文件而不是 .csv,即使源是 csv。如果我尝试在保存之前将其转换为 csv,则保存的 excel sheet 为空。
目标:我想将其下载为原始 csv,或者在将其保存到本地之前将其从 xls 转换为 csv。
我试过几种方法...这是我的service.ts
private containerClient(): ContainerClient {
return new BlobServiceClient(`https://${this.accountName}.blob.core.windows.net?${this.sas}`).getContainerClient(this.containerName);
}
downloadCSV(handler: (blob: Blob) => void){
const blobClient = this.containerClient().getBlockBlobClient("AGENCIES.csv");
blobClient.download().then(res => {
res.blobBody?.then(blob => {
handler(blob);
});
});
}
async downloadCSVwithConnectionString(handler: (blob: Blob) => void){
const containerClient = this.blobServiceConnectionString.getContainerClient(this.containerName);
await containerClient.getBlockBlobClient("AGENCIES.csv").download().then(res => {
res.blobBody?.then(blob => {
handler(blob);
});
});
}
downloadCSVwithConnectionString2(){
const containerClient = this.blobServiceConnectionString.getContainerClient(this.containerName);
return containerClient.getBlockBlobClient("AGENCIES.csv").download();
}
这是我的 component.ts
import { AzureBlobStorageService } from 'src/app/services/azure-storage/azure-blob-storage.service';
import * as XLSX from 'xlsx';
import * as FileSaver from 'file-saver';
tryDownload1(){
tryDownload1(){
this.azure.downloadCSV(blob => {
let url = window.URL.createObjectURL(blob);
window.open(url);
});
}
tryDownload2(){
this.azure.downloadCSVwithConnectionString(blob => {
let csvData = XLSX.utils.sheet_to_csv(blob);
const data: Blob = new Blob([csvData], { type: 'application/vnd.ms-excel' });
FileSaver.saveAs(data, "CSVFile" + new Date().getTime() + '.csv');
});
}
tryDownload3(){
this.azure.downloadCSVwithConnectionString2().then(res => {
console.log(res);
let csvData = XLSX.utils.sheet_to_csv(res);
console.log(csvData);
const data: Blob = new Blob([csvData], { type: 'text/plain' });
console.log(data);
FileSaver.saveAs(data, "CSVFile" + new Date().getTime() + '.csv');
});
}
注意:我使用了 XLSX,因为我找不到只适用于 xls 的工作包
我在其中一个中添加了一些控制台日志,以尝试确定数据是否正确传输到 csv,但似乎没有。
对于遇到此问题的任何人,以下是我的解决方法...
在存储容器中的 Microsoft Azure 上,我打开了正在下载的文件的属性。我将“CONTENT-TYPE”从“application/vnd.ms-excel”更改为“text/csv”.
我在 service.ts 中使用了相同的“downloadCSV”函数,并在 component.ts 中使用了以下函数。所做的更改是将文件名更改为“AGENCIES.csv”而不是随机的 url 密钥。
constructor(
private azure: AzureBlobStorageService,
@Inject(DOCUMENT) private document: Document,
private elementref: ElementRef,
private render: Renderer2
) { }
tryDownload1(){
this.azure.downloadCSV(blob => {
let url = window.URL.createObjectURL(blob);
let downloadLink = this.document.createElement("a");
downloadLink.href = url;
downloadLink.download = "AGENCIES.csv";
this.render.appendChild(this.elementref.nativeElement, downloadLink);
downloadLink.click();
this.render.removeChild(this.elementref.nativeElement, downloadLink);
});
}