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

标签 javascript node.js azure azure-blob-storage

我正在尝试将 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);

我正在使用 postman 上传Excel文件,但是,只有文件路径存储在Excel文件中,而不是实际内容,我该如何解决这个问题,请帮忙? && 下载文件名将作为响应

最佳答案

我创建了一个azure function也许您可以使用 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或返回一个新的可读流的函数,其偏移量是从数据源开始的,所以你不应该使用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");

关于javascript - 如何将所有格式的excel文件上传/下载到azure blob存储Nodejs服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65653637/

相关文章:

javascript - 获取 0 的 documentElement 返回什么

c# - 如何使div可见和不可见

javascript - 使用 Node.js 如何设置 var 来响应 HTTP 客户端?

php - 在 Azure 上运行 ASP.Net Core 和 PHP

azure - 地形 : How to define the Azure Policy Initiative along with Azure Policies?

javascript - 将路径传递给 php 返回未定义

javascript - link.download 未将图像下载到桌面

javascript - Express JS - 在路由和中间件中使用匿名函数

node.js - 在 Travis-CI 上通过 mocha 运行 npm test 时权限被拒绝

azure | Ubuntu 机器与 Windows10 机器成本计算