【问题标题】:Javascript Fetch upload files to Python Flask-restfulJavascript Fetch 上传文件到 Python Flask-restful
【发布时间】:2024-04-28 05:25:02
【问题描述】:

我是 python 和 javascript 的新手,我的任务是创建一个需要上传文件的表单。我需要打后端(flask restful API)。我被告知这是我需要发送请求的方式

requests.post(f"{server}/v1/cand", files={f"{target}_cand": cand_data})

我尝试使用 fetch api 从 javascript 中点击,我得到 201 创建响应,但后端接收的文件是空的。 我不知道我的请求格式是否正确,

 var data = new FormData()
  data.append('files', files[0])
  data.append('name', fileName)
  console.log(data.get('files'))
fetch("http://localhost:5001/v1/cand",{
  method:"POST",
  body: {files:files[0]},
})
.then(function(response){
  return response.json()
})
.then(function(data){
  console.log('success')
  console.log(data)
})

这是在后端接收它的方式

    def post(self):
    cand= []
    for f in request.files:
    //do something

请帮我解决这个问题。

【问题讨论】:

  • 前端部分看起来不错。我猜(因为它不完整)问题出在后端部分。您可能想将您的后端与文档flask.palletsprojects.com/en/1.1.x/patterns/fileuploads 进行比较
  • 我被告知如果被招摇撞到后端运行没有问题,我不确定是否从前端正确发送数据。当我签入网络时,该对象确实是在有效负载中发送的
  • 或者可能只是文件字段名。在python代码中,文件字段名称是{target}_cand,但在js代码中是files
  • 也试过了,没用

标签: javascript python flask flask-restful


【解决方案1】:

抱歉,不敢相信我错过了显而易见的事情。您不会在请求中发送 FormData 实例。你可能想这样做:

document.querySelector('#fileUpload').addEventListener('change', event => {

  let files = event.target.files
  let fileName = files[0].name
  
  // your code start here
  var data = new FormData()
  data.append('files', files[0]) // maybe it should be '{target}_cand'
  data.append('name', fileName)
  console.log(data.get('files'))

  // let url = "http://localhost:5001/v1/cand"
  let url = "https://tongsampah.herokuapp.com"
  fetch(url,{
    method:"POST",
    // body: {files:files[0]}, // wrong
    body: data,
  })
  .then(function(response){
    return response.json()
  })
  // .then(function(data){ // use different name to avoid confusion
  .then(function(res){
    console.log('success')
    console.log(res)
  })

})
<input type="file" id="fileUpload" />

https://tongsampah.herokuapp.com 只是一个我用来测试的虚拟 api 服务器。它将请求详细信息作为响应返回

您可能需要确保字段名称正确(例如{target}_cand -- 我不知道目标值是什么)

【讨论】:

  • 它成功了,目标是文件路径,当我添加数据时它很顺利,非常感谢,我已经为此工作了大约 8 个小时。