You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ajax获取MIDI文件并设置midi-visualizer的src?

解决midi-visualizer的src设置错误问题

这个错误其实是两个关键问题导致的:一是前端没有正确配置Ajax请求的响应类型,二是服务器返回的是文件路径字符串而非MIDI文件的二进制数据。咱们一步步来修复:

第一步:修复服务器端Python代码

你当前的服务器代码返回的是MIDI文件的路径字符串,但前端需要的是文件的二进制内容。修改代码,读取生成的MIDI文件并返回二进制数据:

def generate(request):
    if request.method == "POST":
        # 生成旋律的原有逻辑不变
        midi_file_path = mg.save_melody(melody)
        
        # 读取MIDI文件的二进制内容
        with open(midi_file_path, 'rb') as midi_file:
            midi_binary = midi_file.read()
        
        # 返回二进制数据,指定正确的内容类型
        return HttpResponse(midi_binary, content_type="audio/midi", status=200)
        
        # 可选:如果临时文件不需要保留,可以在这里删除它
        # import os
        # os.remove(midi_file_path)

第二步:修复前端Ajax代码

需要给XMLHttpRequest设置responseType为blob,这样服务器返回的二进制数据会被解析成Blob对象,才能用URL.createObjectURL生成合法的对象URL:

// Create new request add token
const generateRequest = new XMLHttpRequest();
generateRequest.open('POST', '/generate');
generateRequest.setRequestHeader('X-CSRFToken', csrftoken);
// 关键:设置响应类型为blob,确保返回的是二进制Blob对象
generateRequest.responseType = 'blob';

generateRequest.onload = () => {
    if (generateRequest.status === 200) {
        // 现在response是Blob对象,可直接生成对象URL
        let objectURL = URL.createObjectURL(generateRequest.response);
        document.getElementById('myVisualizer').src = objectURL;
        
        // 可选:当组件不再使用该URL时,记得释放资源避免内存泄漏
        // 比如在页面卸载或更换src时调用:
        // URL.revokeObjectURL(objectURL);
    } else {
        console.error('请求失败,状态码:', generateRequest.status);
    }
};

// Add the motif to send with the request
const data = new FormData();
data.append('motif', JSON.stringify(notes));

// Send request
generateRequest.send(data);

这样修改后,前端就能正确获取MIDI文件的二进制数据,生成合法的对象URL并赋值给midi-visualizer的src,搭配midi-player就能正常工作了。

内容的提问来源于stack exchange,提问作者juancopi81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:12:32