我想实现一个功能,上传录制的音频斑点数据到蓝色斑点存储在前端(react.js). 我有Azure存储连接字符串,但我不希望我的连接字符串在前端expose . 有没有办法定义一个后端API来从Azure凭据生成令牌(具有到期时间),以便我可以在前端使用它? 我是否需要从Azure帐户进行其他设置?

PS.和这个差不多. 对于Azure语音认知SDK,有一个使用语音区域和语音密钥下发令牌的接口. Https://{SPEECH_REGION}.api.cognitive.microsoft.com/sts/v1.0/issueToken

我try 使用SAS令牌,但它似乎非常复杂.

推荐答案

如何为Blob使用令牌而不是Azure连接字符串 存储访问

可以,您可以创建后端API来为您的Azure Blob存储帐户生成SAS令牌.这样,您可以在服务器端保护您的连接字符串和帐户密钥的安全,并且只向前端公开SAS令牌.

您可以使用以下代码从后端使用SAS令牌上传音频文件.

首先,创建一个后端目录来生成sas-Token.

mkdir backend 
cd backend

Package:个个

  npm install express
  npm install @azure/storage-blob
  

server.js

const express = require('express');
const app = express();
const cors = require('cors');
const { BlobServiceClient, StorageSharedKeyCredential, generateAccountSASQueryParameters, AccountSASPermissions, AccountSASServices, AccountSASResourceTypes, SASProtocol } = require('@azure/storage-blob');

const accountName = 'your-account-name';
const accountKey = 'your-account-key';

const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
const blobServiceClient = new BlobServiceClient(`https://${accountName}.blob.core.windows.net`);

app.use(express.json());
app.use(cors({ origin: 'http://localhost:3001' }));

app.get('/generate-sas-token', async (req, res) => {
  const { blobName } = req.query;


  const sasOptions = {
    expiresOn: new Date(Date.now() + 3600 * 1000), // Expires in 1 hour
    permissions: AccountSASPermissions.parse('racwd'),
    services: AccountSASServices.parse('bf').toString(), // Blobs only
    resourceTypes: AccountSASResourceTypes.parse('sco').toString(), // Service, Container, and Object
    protocol: SASProtocol.HttpsAndHttp
  };

  const sasToken = generateAccountSASQueryParameters(sasOptions, sharedKeyCredential).toString();
  res.json({ sasToken });
  console.log(sasToken);
});

const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

backend目录中运行以下命令启动后端API:

node server.js

现在前端使用的是Reaction应用程序.

Package:个个

npm install axios

AudioUploader.js

import React, { useState } from 'react';
import axios from 'axios';


function AudioUploader() {
  const [selectedFile, setSelectedFile] = useState(null);
  const [sasToken, setSasToken] = useState('');
  const [uploadStatus, setUploadStatus] = useState('');

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const generateSasToken = async () => {
    try {
      const response = await axios.get(`/generate-sas-token?blobName=${selectedFile.name}`);
      setSasToken(response.data.sasToken);
    } catch (error) {
      console.error('Error generating SAS token:', error);
    }
  };

  const uploadAudio = async () => {
    if (!sasToken || !selectedFile) {
      console.error('SAS token or file not selected.');
      return;
    }

    const blobUrl = `https://<Your-storage>.blob.core.windows.net/<container-name>/${selectedFile.name}?${sasToken}`;
    const headers ={'x-ms-blob-type': 'BlockBlob'};
    try {
      await axios.put(blobUrl, selectedFile,{headers});
      setUploadStatus('Upload successful!');
    } catch (error) {
      console.error('Error uploading audio:', error);
      setUploadStatus('Upload failed.');
    }
  };

  return (
    <div>
      <h2>Audio Uploader</h2>
      <input type="file" onChange={handleFileChange} />
      <button onClick={generateSasToken}>Generate SAS Token</button>
      {sasToken && (
        <div>
          <button onClick={uploadAudio}>Upload Audio</button>
        </div>
      )}
      {uploadStatus && <p>{uploadStatus}</p>}
    </div>
  );
}

export default AudioUploader;

Output: enter image description here

Browser:

enter image description here

Portal:

enter image description here

这是我的GitHub链接,可以通过后端API使用Java脚本将音频文件上传到Azure BLOB存储.

Javascript相关问答推荐

如何使用React渲染器放置根dis?

在分区内迭代分区

zoom svg以适应圆

没有输出到带有chrome.Devtools扩展的控制台

使用i18next在React中不重新加载翻译动态数据的问题

react—router v6:路由没有路径

为什么!逗号和空格不会作为输出返回,如果它在参数上?

无法访问Vue 3深度监视器中对象数组的特定对象值'

如何在输入元素中附加一个属性为checkbox?

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

我怎么在JS里连续加2个骰子的和呢?

如何迭代叔父元素的子HTML元素

如何创建返回不带`new`关键字的实例的类

第三方包不需要NODE_MODULES文件夹就可以工作吗?

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

判断函数参数的类型

如果NetSuite中为空,则限制筛选

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

如何在Firebase中读取对象的特定字段?

当达到高度限制时,如何裁剪图像?使用html和css