【问题标题】:PUT request for file in django-react-redux在 django-react-redux 中对文件的 PUT 请求
【发布时间】:2020-10-01 06:51:36
【问题描述】:

我尝试在 Django-react-redux 中为该文件应用 put 请求。我试图做的是,用户应该使用从 put 请求中提交的 ID 替换文件。我在django-restframework中写了如下代码。

class EarSingleView(APIView):

    parser_classes = (MultiPartParser, FormParser)

    def get(self, request, ear_id, *args, **kwargs):
        ear = Ear.objects.get(pk=ear_id)
        serializer = EarSerializers(ear)
        return Response(serializer.data)

    def delete(self, request, ear_id, *args, **kwargs):
        ear = Ear.objects.get(pk=ear_id)
        ear.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

    def put(self, request, ear_id):
        ear = Ear.objects.get(pk=ear_id)
        serializer = EarSerializers(ear, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的获取请求和删除请求运行良好。但是在PUT请求中,如果我尝试更改文件归档并尝试提交,就会出现如下错误,400:Bad request. detail: "Multipart form parse error - Invalid boundary in multipart: None"

我的表格是这样的,

<form onSubmit={this.onSubmit} encType="multipart/form-data">
  <Input
    placeholder="Enter layer name..."
    name="name"
    value={name}
    onChange={this.onChange}
   />

   <input
     type="file"
     name="fileName"
     onChange={this.handleFileChange}
   />
</form>

我的表单 onSubmit 事件是这样的,

onSubmit = (e) => {
    e.preventDefault();
    const {
      name,
      file,
    } = this.state;

    const newEARData = {
      id: this.props.idNumber,
      name,
      file,
    };

    axios
    .put(`http://localhost:8000/api/ear/${newEARData.id}`, newEARData, {
      headers: {
        "content-type": "multipart/form-data",
      },
    })
    .then((res) => {
      dispatch({
        type: UPDATE_EAR,
        payload: res.data,
      });
    })
}

获取请求是这样的,

 axios
    .get(`http://localhost:8000/api/ear/${id}`)
    .then((res) => {
      dispatch({ type: GET_DETAILED_EAR, payload: res.data });
    })

请任何人向我建议在 django-react-redux 设置中替换文件(放置请求)的最佳方法是什么?

【问题讨论】:

  • 能否添加gey API请求的JavaScript代码?
  • 我更新了问题,请帮助我。我非常接近@vivek 回答的解决方案。提前谢谢你

标签: django reactjs file redux django-rest-framework


【解决方案1】:

要传递多部分的formdata,需要通过FormData传递,简单的json对象是不行的

const formData = new FormData();
formData.append('id',this.props.idNumber)
formData.append('name',name)
formData.append('file',file)
axios.put(`http://localhost:8000/api/ear/${this.props.idNumber}`, formData, {
    headers: {
    "content-type": "multipart/form-data",
    },
})

【讨论】:

  • 我刚试过这个方法。它发生 404 未定义的错误。我认为this.props.idNumber 没有附加。
  • @dhiraj,更新答案,网址错误,应该是http://localhost:8000/api/ear/${this.props.idNumber},立即查看
  • 非常感谢。现在它可以工作了,但还有一个问题,如果我只想更新name文件,它会显示400 bad request, file: ["The submitted data was not a file. Check the encoding type on the form."]的错误消息,我该如何解决这个问题?
  • 在这种情况下只需传递formData.append('id',this.props.idNumber) formData.append('name',name) 不要附加表单
  • 不要附加您的意思的file 字段?
猜你喜欢
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2022-12-21
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多