无法在前端使用JavaScript Fetch API将文件上传到FastAPI后端

bbuxkriu  于 2023-06-20  发布在  Java
关注(0)|答案(2)|浏览(189)

我试图弄清楚如何将图像发送到我的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做一些不应该做的事情。

w6lpcovy

w6lpcovy1#

根据文件:

警告:当使用FormData提交POST请求时,使用XMLHttpRequestFetch_API,其内容类型为multipart/form-data(例如:上传FilesBlobs到服务器时),不要在请求上显式设置Content-Type头。这样做将阻止浏览器使用boundary表达式设置Content-Type头,它将使用该表达式来分隔请求主体中的表单字段。

因此,在发送fetch请求时,应该从代码中删除Content-Type头。这同样适用于通过Python Requests发送请求,如herehere所述。阅读更多关于boundary in multipart/form-data的信息。

后端使用FastAPI上传文件,前端使用Fetch API上传文件的工作示例hereherehereherehere

ruyhziif

ruyhziif2#

所以我想出了这一个感谢一个有用的小伙子在Python的Discord服务器。

function lastOpp(bildeFila) {
            let data = new FormData();
            data.append('file',bildeFila)
            data.append('token','SOMETOKENINFO')
}
@app.post("/endreProfilbilde")
async def endreProfilbilde(token: str = Form(...),file: UploadFile = File(...)):
    print(file.filename)
    print(token)

将字符串值作为formData的一部分发送,而不是作为头发送,这样我就可以获取参数。

相关问题