如何上传/下载所有格式的excel文件到azure blob存储Nodejs服务器端



我正在尝试将excel文件上传到azure blob存储

import { DefaultAzureCredential } from '@azure/identity';
import { BlobServiceClient } from '@azure/storage-blob';
// Enter your storage account name
const account = process.env.ACCOUNT_NAME;
// Unique name for the container
const containerName = process.env.CONTAINER_NAME;
// Azure AD Credential information is required to run this sample:
if (
!process.env.AZURE_TENANT_ID ||
!process.env.AZURE_CLIENT_ID ||
!process.env.AZURE_CLIENT_SECRET || !account || !containerName
) {
return next(SystemResponse.badRequestError('Azure AD authentication information not provided, but it is required to run this sample. Exiting.'));
}
const defaultAzureCredential = new DefaultAzureCredential();
const blobServiceClient = new BlobServiceClient(
`https://${account}.blob.core.windows.net`,
defaultAzureCredential,
);

// Get a reference to a container
const containerClient = blobServiceClient.getContainerClient(containerName);
// Upload data to the blob
const blobName = `${req.files.file.name.split('.')[0]}+${new Date().getTime()}.${req.files.file.name.split('.')[1]}`;
// create blobClient for container
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
// upload file
const uploadBlobResponse = await blockBlobClient.upload(`${containerName}${req.files.file.path}`, req.files.file.size);

我正在使用poster上传excel文件,但是,只有文件路径存储在excel文件中,实际上没有内容,我该如何解决这个问题plz帮助?&在下载文件名是来响应

我创建了一个azure函数,也许你可以使用parse-multipart来接收你的文件:

安装:

npm install parse-multipart

代码:

import { AzureFunction, Context, HttpRequest } from "@azure/functions"
import { DefaultAzureCredential } from '@azure/identity';
import { BlobServiceClient } from '@azure/storage-blob';
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
var multipart = require('parse-multipart');
var bodyBuffer = Buffer.from(req.body);
var boundary = multipart.getBoundary(req.headers['content-type']);
var parts = multipart.Parse(bodyBuffer, boundary);
// Enter your storage account name
const account = process.env.ACCOUNT_NAME;
// Unique name for the container
const containerName = process.env.CONTAINER_NAME;
// Azure AD Credential information is required to run this sample:
if (
!process.env.AZURE_TENANT_ID ||
!process.env.AZURE_CLIENT_ID ||
!process.env.AZURE_CLIENT_SECRET || !account || !containerName
) {
return next(SystemResponse.badRequestError('Azure AD authentication information not provided, but it is required to run this sample. Exiting.'));
}
const defaultAzureCredential = new DefaultAzureCredential();
const blobServiceClient = new BlobServiceClient(
`https://${account}.blob.core.windows.net`,
defaultAzureCredential,
);

// Get a reference to a container
const containerClient = blobServiceClient.getContainerClient(containerName);
// Upload data to the blob
const blobName = `${parts[0].filename.split('.')[0]}+${new Date().getTime()}.${parts[0].filename.split('.')[1]}`;
// create blobClient for container
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
// upload file
const uploadBlobResponse = await blockBlobClient.upload(parts[0].data , parts[0].data.length);
};

原因:

function upload(body: HttpRequestBody, contentLength: number, options?: BlockBlobUploadOptions)

HttpRequestBody的值应该是Blob, string, ArrayBuffer, ArrayBufferView or a function which returns a new Readable stream whose offset is from data source beginning,所以不应该使用path。

====================更新================

根据讨论,应该根据相对路径读取文件,并将文件的二进制数据转换为base64字符串。

var fs = require('fs');
var path = require('path'); 
//set relative path to file 
let relativePath = path.relative(process.cwd(),${req.files.file.path}); 
//reading binary data of file 
let binaryData=fs.readFileSync(relativePath); 
//converting binary data to base64 string 
let base64String=Buffer.from(binaryData).toString("base64")
await blockBlobClient.upload(base64String, req.files.file.size);

====================更新2====================

const containerClient = blobServiceClient.getContainerClient(containerName);
// Upload data to the blob
const blobName = `xxx.xlsx`;
// create blobClient for container
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
const downloadBlockBlobResponse = blockBlobClient.downloadToFile("D:\xxx\xxx.xlsx");

最新更新