Starlette -类型错误:FormData对象不可调用



我正在上传一个音频文件到Starlette服务器,我试图以他们在文档中推荐的方式访问它,但它给了我一个不可调用的错误。我收集的问题是在request对象上调用.form(),但我不确定如何读取它。

服务器路由:

@app.route('/api/upload_track/', methods=['POST'])
async def separate_vocals(request):
audio_data = await request.form()
separator = Separator('spleeter:2stems')
audio_bytes = await (audio_data['file'].read())
return audio_data
客户:

function FileUploadSingle() {
const [file, setFile] = useState([]);
const handleFileChange = (e) => {
if (e.target.files) {
setFile(e.target.files[0]);
}
};

let audioData = new FormData();
const blob = new Blob([file], {type: 'audio/mpeg'});
audioData.append('file', file, 'file');
console.log(file);
console.log(audioData.get('file'));
// 👇 Uploading the file using the fetch API to the server
fetch(`${RESTAPI_URL}/api/upload_track/`, {
method: 'POST',
body: audioData, 
})
.then((res) => res.json())
.then((data) => console.log(data))
.catch((err) => console.error(err));
};
}
export default FileUploadSingle;

以下错误:

TypeError: 'FormData' object is not callable

是在从端点(即return audio_data)返回使用await request.form()获得的FormData对象时引起的-我确信它不是您首先想要返回的对象,而是audio_bytes。现在,如果您尝试使用return audio_bytes返回字节数组,您将得到:

TypeError: 'bytes' object is not callable

在Starlette中,您可以使用Response类来返回bytes,例如:

from starlette.responses import Response
@app.route('/upload', methods=['POST'])
async def upload(request):
form = await request.form()
contents = await form['file'].read()
return Response(contents)

Response类还允许您使用media_type参数指定MIME类型(也称为媒体类型)。

相关内容

  • 没有找到相关文章