javascript - 如何在 React js 中向用户发送可下载的链接
问题描述
我正在尝试使其成为用户可以将文件上传到站点并转换其文件的位置。然后下载回来。我使用 JavaScripts Web 音频 api 来做到这一点。现在我只需要让用户下载文件回来。我创建了一个 blob,但我目前被卡住了。
ConverterSec2.jsx:
class ConverterSec2 extends Component {
render() {
return (
<div className="sec2">
<form>
<input type="file" id="audio-file" name="file" accept="audio/mpeg, audio/ogg, audio/*" />
<button type="Submit" id="convert_btn">Convert to 432Hz</button>
<script src="ihertz_website/src/pages/Converter/compressor.js"></script>
</form>
</div>
)
}
} 导出默认 ConverterSec2
转换.js:
//render proccessed audio
offlineAudioCtx.startRendering().then(function(renderBuffer){
make_download(renderBuffer, offlineAudioCtx.length)
console.log("ERROR: PROCCESSING AUDIO")
})
//download Audio buffer as downloadable WAV file
function make_download(abuffer, total_samples) {
//get duration and sample rate
var duration = abuffer.duration,
rate = abuffer.sampleRate,
offset = 0;
var new_file = URL.createObjectURL(bufferToWave(abuffer, total_samples));
var download_link = document.getElementById("download_link");
download_link.href = new_file;
var name = generateFileName();
download_link.download = name;
}
//generate name of file
function generateFileName() {
var origin_name = fileInput.files[0].name;
var pos = origin_name.lastIndexOf('.');
var no_exit = origin_name.slice(0, pos);
return no_exit + ".wav";
}
//Convert an AudioBuffer to a Blob using WAVE representation
function bufferToWave(abuffer, len) {
var numOfChan = abuffer.numberOfChannels,
length = len * numOfChan * 2 + 44,
buffer = new ArrayBuffer(length),
view = new DataView(buffer),
channels = [], i, sample,
offset = 0,
pos = 0;
//write WAVE header
setUnit32(0x464664952);
setUnit32(length - 8);
setUint32(0x45564157); // "WAVE"
setUint32(0x20746d66); // "fmt " chunk
setUint32(16); // length = 16
setUint16(1); // PCM (uncompressed)
setUint16(numOfChan);
setUint32(abuffer.sampleRate);
setUint32(abuffer.sampleRate * 2 * numOfChan); // avg. bytes/sec
setUint16(numOfChan * 2); // block-align
setUint16(16); // 16-bit (hardcoded in this demo)
setUint32(0x61746164); // "data" - chunk
setUint32(length - pos - 4); // chunk length
// write interleaved data
for(i = 0; i < abuffer.numberOfChannels; i++)
channels.push(abuffer.getChannelData(i));
while(pos < length) {
for(i = 0; i < numOfChan; i++) { // interleave channels
sample = Math.max(-1, Math.min(1, channels[i][offset])); // clamp
sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767)|0; // scale to 16-bit signed int
view.setInt16(pos, sample, true); // write 16-bit sample
pos += 2;
}
offset++ // next source sample
}
//create Blob
return new Blob([buffer], {type: "audio/wav"});
function setUint16(data) {
view.setUint16(pos, data, true);
pos += 2;
}
function setUnit32(data) {
view.setUint32(pos, data, true);
pos += 4;
}
}
解决方案
推荐阅读
- javascript - 将 DIV 元素位置保持为粘滞后悬停不工作
- node.js - npm install 在执行期间清空的 uglify-js 文件夹上失败
- php - 在 Laravel 中使用原始 sql 查询
- .net-core - .Net 5 Azure Function App,使用 Startup 类
- php - php xpath 从 Joomla / hikashop 描述中提取标签内容
- tensorflow - 数据集中张量的 ref() 不相等。为什么?
- c# - 如何在反序列化之前从 json 字符串中删除元素?
- javascript - IIS ASP NET Core 上的微调器加载失败
- c# - 每当刷新数据网格时向上移动垂直滚动条
- c# - 在 C# 中对数组进行排序,除了一个数字