如何使用带有vue的fastapi上传文件?我收到无法处理的错误 422

How to upload file using fastapi with vue? I got error unprocessable 422

我正在尝试将文件上传到目录中,我在 Python 中使用 vue.js 和 fastapi。

但是每次报错422 unprocessable function

我试过这样使用官方文档:

<!-- Vue Template --> 

<input
    style="display: none"
    type="file"
    name="files"
    ref="fileAdd"
    v-on:change="handleFilesChange()"
/>
// Vue Script

handleFilesChange() {
    var uploadedFiles = this.$refs.fileAdd.files;
    if (uploadedFiles.length > 0) {
      for (var i = 0; i < uploadedFiles.length; i++) {
        this.files.push(uploadedFiles[i]);

        var formData = new FormData();
        formData.append("files", this.$refs.fileAdd.files[0]);
        axios
          .post(url + "/uploadfile", formData, {
            headers: {
              "Content-Type": "multipart/form-data",
            },
            onUploadProgress: (uploadStatus) => {
              this.uploadProgress = Math.round(
                (uploadStatus.loaded / uploadStatus.total) * 100
              );
              this.isUplading = true;
            },
          })
          .then((response) => {do something}
        }
    }
}
# FastAPI endpoint

@app.post('/uploadfile')
async def upload_file(sid: str, files: List[UploadFile]=File(...)):
    print(files)
    if(files == []):
        print("No Files")
    else:
        print(files[0].filename)
    #...do something

我收到无法处理的错误 422。

知道如何解决这个问题吗?

我不是 vuejs 专家(也不是 javascript),但我认为问题在于你传递给 axios 的内容:

formData.append("files", this.$refs.fileAdd.files[0]);

在上面一行中,你(据我了解 vuejs 和你的代码)是一个文件([0])而不是文件数组。

想法是传递一个文件数组,我想可以这样实现:

formData.append("files", this.$refs.fileAdd.files);

formData.append("files", [this.$refs.fileAdd.files[0]]);

类似的问题已经有人提出并回答了,所以可能值得一看