我试图弄清楚如何将图像发送到我的API,并验证请求的header
中生成的token
。
到目前为止,这是我在哪里:
@app.post("/endreProfilbilde")
async def endreProfilbilde(request: Request,file: UploadFile = File(...)):
token=request.headers.get('token')
print(token)
print(file.filename)
我有另一个函数来触发更改侦听器和上传函数,传递参数:bildeFila
function lastOpp(bildeFila) {
var myHeaders = new Headers();
let data = new FormData();
data.append('file',bildeFila)
myHeaders.append('token', 'SOMEDATAHERE');
myHeaders.append('Content-Type','image/*');
let myInit = {
method: 'POST',
headers: myHeaders,
cache: 'default',
body: data,
};
var myRequest = new Request('http://127.0.0.1:8000/endreProfilbilde', myInit);
fetch(myRequest)//more stuff here, but it's irrelevant for the Q
}
问题:这将打印上传文件的filename
,但token
没有通过,而是打印为None
。我怀疑这可能是由于content-type
,或者我试图强迫FastAPI做一些不应该做的事情。
2条答案
按热度按时间w6lpcovy1#
根据文件:
警告:当使用
FormData
提交POST
请求时,使用XMLHttpRequest
或Fetch_API
,其内容类型为multipart/form-data
(例如:上传Files
和Blobs
到服务器时),不要在请求上显式设置Content-Type
头。这样做将阻止浏览器使用boundary
表达式设置Content-Type
头,它将使用该表达式来分隔请求主体中的表单字段。因此,在发送
fetch
请求时,应该从代码中删除Content-Type
头。这同样适用于通过Python Requests发送请求,如here和here所述。阅读更多关于boundary in multipart/form-data的信息。后端使用FastAPI上传文件,前端使用Fetch API上传文件的工作示例有here、here、here、here、here。
ruyhziif2#
所以我想出了这一个感谢一个有用的小伙子在Python的Discord服务器。
将字符串值作为formData的一部分发送,而不是作为头发送,这样我就可以获取参数。