在反应组件中播放 s3 音频并下载文件

Posted

技术标签:

【中文标题】在反应组件中播放 s3 音频并下载文件【英文标题】:playing s3 audio and downloading the file in react component 【发布时间】:2021-07-17 22:07:54 【问题描述】:

我正在尝试构建一个组件,该组件可以播放我的 s3 存储桶中的音频文件,并有一个按钮可以在需要时在本地下载文件。

根据我的研究,这是我现在所拥有的,但它不起作用。我想我可能需要下载一个库?

代码:

import React from 'react';

<script src="https://unpkg.com/boxicons@latest/dist/boxicons.js"></script>

function AudioFilePlayer(props) 
  var name = props.name;
  var id = props.id;
  var s3_url = props.s3_url;

  const handleAudioPlay = (s3_url_link, state) => 
    
    var audio = new Audio(s3_url_link)

    if (state) 
      audio.play() 
    
    else 
      audio.pause() 
    

  

 //no clue how to download
  return (
    <div className="AudioFileListItem">
      <div className="AudioFileListElements">
        <a href="javascript:void(0);" onClick=handleAudioPlay(s3_url, true)>
          <span className="AudioFilePlayButton">
            <box-icon name='play-circle' color='#ffffff' size="sm"></box-icon>
          </span>
          <span className="AudioFilePlayButtonTitle">
            Play
          </span>
        </a>
       <a ref="javascript:void(0);" onClick=handleDownloadPlay(s3_url, true)> 
        <span className="AudioFileDownloadButton">
          <box-icon name='download' type='solid' color='#ffffff' size="sm"></box-icon>
        </span>
        <span className="AudioFileDownloadButtonTitle">
          Download
        </span>
       </a> 
      </div>
    </div>
  );


export default AudioFileListItem;

我测试了 aws s3_url,效果很好。打开链接时,它会在我的浏览器中下载正确的 wav 文件。

示例链接是:

https://bobmarley.s3.amazonaws.com/music/34/reggae.wav

我想要的结果是能够单击播放 html(用户按钮),将其更改为暂停外观(我可以轻松地做到这一点),然后实际播放音频。当我想停止音频时,我可以按下它,它应该会暂停并再次显示播放按钮。

对于下载按钮,我只想下载文件。我知道我可以通过在选项卡中打开网址来做到这一点,但我不想透露网址。我想知道是否有另一种方法可以在不向用户显示 url 的情况下做到这一点。

我已经在这工作了好几个星期了,所以真的任何帮助对我来说都意味着世界。

非常感谢您和这个社区!

【问题讨论】:

【参考方案1】:

我改变了 2 件事,从我这边来说效果很好

    建议使用onClick=handleAudioPlay(s3_url, true) 使用onClick=()=&gt;handleAudioPlay(s3_url, true) 由于我无法从我身边访问https://bobmarley.s3.amazonaws.com/music/34/reggae.wav,所以我使用此网址https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3 进行测试。

ReactDOM.render(<AudioFilePlayer />, document.getElementById("root"));

function AudioFilePlayer(props) 
    let name = props.name;
    let id = props.id;
    let s3_url = "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3";

    const handleAudioPlay = (s3_url_link, state) => 
        var audio = new Audio(s3_url_link);
        if (state) 
            audio.play();
         else 
            audio.pause();
        
    ;

    //no clue how to download
    return (
        <div className="AudioFileListItem">
            <div className="AudioFileListElements">
                <a
                    href="javascript:void(0);"
                    onClick=()=>handleAudioPlay(s3_url, true)
                >
                    <span className="AudioFilePlayButton">
                        <box-icon
                            name="play-circle"
                            color="#ffffff"
                            size="sm"
                        ></box-icon>
                    </span>
                    <span className="AudioFilePlayButtonTitle">Play</span>
                </a>
                <a
                    href="javascript:void(0);"
                    // onClick=handleDownloadPlay(s3_url, true)
                >
                    <span className="AudioFileDownloadButton">
                        <box-icon
                            name="download"
                            type="solid"
                            color="#ffffff"
                            size="sm"
                        ></box-icon>
                    </span>
                    <span className="AudioFileDownloadButtonTitle">
                        Download
                    </span>
                </a>
            </div>
        </div>
    );
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
  <div id="root"></div>

【讨论】:

那么这里没有下载音频的解决方案吗?

以上是关于在反应组件中播放 s3 音频并下载文件的主要内容,如果未能解决你的问题,请参考以下文章

如何下载播放音频

从 URL 下载音频文件并在 iOS 应用程序中播放

如何从 Swift 文件管理器播放音频文件?

如何下载并保存音频文件然后快速播放?

AWS S3 IOS中的混乱sdk?

在系统包中播放下载的视频