如何使用 JavaScript 和 FastAPI 上传多个文件?
How can I upload multiple files using JavaScript and FastAPI?
我遵循了 FastAPI 文档,我正在尝试将文件从我的客户端用 js 发送到我的服务器用 FastAPI 编写。
我的HTML:
<html>
<head>
<script src="https://code.jquery.com/jquery-2.0.3.js" integrity="sha256-lCf+LfUffUxr81+W0ZFpcU0LQyuZ3Bj0F2DQNCxTgSI=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<input id='fileid' type='file' value="Load miRNA data"/>
<input id='fileid2' type='file' value="Load Target data"/>
<input id='buttonid' type='button' value='Upload' />
</body>
<script type="text/javascript" src="./uplaodfiles.js"></script>
</html>
我的uploadfiles.js
document.getElementById('buttonid').addEventListener('click', generate);
function generate() {
let file = document.getElementById("fileid").files[0];
let file2 = document.getElementById("fileid2").files[0];
let formData = new FormData();
formData.append("file",file,file.name)
formData.append("file2",file2,file2.name)
console.log(formData)
axios.post('http://127.0.0.1:8000/actions/upload', formData, {
headers: {
'content-Type': 'multipart/form-data'
}
})
}
action.py
from typing import List
from fastapi import APIRouter,Header,HTTPException,FastAPI, File, UploadFile
router = APIRouter()
import pandas as pd
@router.post('/upload')
def upload_file(files: List[UploadFile] = File(...)):
print('Arrived')
无法成功获取文件,我在服务器端收到错误消息:
INFO: 127.0.0.1:59210 - "POST /actions/upload HTTP/1.1" 422 Unprocessable Entity
客户:
Uncaught (in promise) Error: Request failed with status code 422
at e.exports (isAxiosError.js:10)
at e.exports (isAxiosError.js:10)
at XMLHttpRequest.l.onreadystatechange (isAxiosError.js:10)
我该如何解决这个问题以及如何使用我在上传端点收到的那些文件?
问题可能是由于您传递参数 file1
和 file2
而端点需要 List
个名为 files
的文件。
我还没有测试代码,但基本思路是用实际文件创建一个数组并将其添加到名称 files
下的 FormData
。下面的代码应该会让您了解如何实现您的目标。
let formData = new FormData();
formData.append("files",[file, file2]);
或者,如果我的解决方案不起作用,您可以尝试使用此解决方案Uploading multiple files using formData(),但同样,我的回答主要是为了引导您走上正确的道路。
我最近遇到了同样的问题,用Isabi提到的答案无法解决。但它给了我正确的想法:
文件可以彼此分开附加,重要的是两者都使用与参数相同的名称:
formData.append('files',file)
formData.append('files',file2)
或者如果您已经在使用文件数组:
let formData = new FormData();
for (var i = 0; i < files.length; i++){
formData.append('files',files[i])
}
我遵循了 FastAPI 文档,我正在尝试将文件从我的客户端用 js 发送到我的服务器用 FastAPI 编写。
我的HTML:
<html>
<head>
<script src="https://code.jquery.com/jquery-2.0.3.js" integrity="sha256-lCf+LfUffUxr81+W0ZFpcU0LQyuZ3Bj0F2DQNCxTgSI=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<input id='fileid' type='file' value="Load miRNA data"/>
<input id='fileid2' type='file' value="Load Target data"/>
<input id='buttonid' type='button' value='Upload' />
</body>
<script type="text/javascript" src="./uplaodfiles.js"></script>
</html>
我的uploadfiles.js
document.getElementById('buttonid').addEventListener('click', generate);
function generate() {
let file = document.getElementById("fileid").files[0];
let file2 = document.getElementById("fileid2").files[0];
let formData = new FormData();
formData.append("file",file,file.name)
formData.append("file2",file2,file2.name)
console.log(formData)
axios.post('http://127.0.0.1:8000/actions/upload', formData, {
headers: {
'content-Type': 'multipart/form-data'
}
})
}
action.py
from typing import List
from fastapi import APIRouter,Header,HTTPException,FastAPI, File, UploadFile
router = APIRouter()
import pandas as pd
@router.post('/upload')
def upload_file(files: List[UploadFile] = File(...)):
print('Arrived')
无法成功获取文件,我在服务器端收到错误消息:
INFO: 127.0.0.1:59210 - "POST /actions/upload HTTP/1.1" 422 Unprocessable Entity
客户:
Uncaught (in promise) Error: Request failed with status code 422
at e.exports (isAxiosError.js:10)
at e.exports (isAxiosError.js:10)
at XMLHttpRequest.l.onreadystatechange (isAxiosError.js:10)
我该如何解决这个问题以及如何使用我在上传端点收到的那些文件?
问题可能是由于您传递参数 file1
和 file2
而端点需要 List
个名为 files
的文件。
我还没有测试代码,但基本思路是用实际文件创建一个数组并将其添加到名称 files
下的 FormData
。下面的代码应该会让您了解如何实现您的目标。
let formData = new FormData();
formData.append("files",[file, file2]);
或者,如果我的解决方案不起作用,您可以尝试使用此解决方案Uploading multiple files using formData(),但同样,我的回答主要是为了引导您走上正确的道路。
我最近遇到了同样的问题,用Isabi提到的答案无法解决。但它给了我正确的想法:
文件可以彼此分开附加,重要的是两者都使用与参数相同的名称:
formData.append('files',file)
formData.append('files',file2)
或者如果您已经在使用文件数组:
let formData = new FormData();
for (var i = 0; i < files.length; i++){
formData.append('files',files[i])
}