django使用fetch上传文件

在上一篇文章中,我包装了fetch方法,使其携带cookie。但是之前fetch传递的是json数据,现在有了一个上传文件的需求,因此需要进行修改:

js 复制代码
const sendRequest = (url, method, data) => {
  const csrftoken = Cookies.get('csrftoken')
  const options = {
    method: method,
    headers: {
      'X-CSRFToken': csrftoken,
      // 'Content-Type': 'multipart/form-data', //这里可以是application/json,后端需要方式二获取参数
      withCredentials: true //跨域时携带cookie
    },
    credentials: 'include', //要求携带cookie,否则无法维持会话
  }
  if (method != 'GET' && data && Object.keys(data).length > 0) {
    if (data instanceof FormData) {
      options.body = data
    }
    else {
      let formdData = new FormData()
      for (let key in data) {
        let value = data[key]
        if (value instanceof Object
          && !(value instanceof File)
          && !(value instanceof Blob)) {
          value = JSON.stringify(value)
        }
        formdData.append(key, value)
      }
      options.body = formdData
    }
  }
  return fetch(`http://localhost:8000/${url}`, options)
}

这里还是选择使用formData进行传递数据,一是django可以从POST.get(key)直接获取参数,如果是浅层的就不需要额外json.parse 了,二是json传输文件需要base64,可能有性能损失。

注意

这里注意了,不要header中不要设置Content-Type,否则上传失败。

这是因为header中包含了一段boundary指明文件的间隔。可以看下成功的请求头:

在后端就从request.FILES.get(key)获取文件,从request.POST.get(key)获取其他参数。

在传参的时候,还是直接传递一个json就可以,然后将其处理为FormData格式。

相关推荐
加号311 小时前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏12 小时前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐12 小时前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
多恩Stone12 小时前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ40220549612 小时前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
百锦再12 小时前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
starlaky12 小时前
Django入门笔记
笔记·django
QQ51100828512 小时前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
QQ_196328847512 小时前
Python-flask框架西山区家政服务评价系统网站设计与开发-Pycharm django
python·pycharm·flask
WeiXin_DZbishe12 小时前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5