python flask框架接受axios发送的图片文件

news2024/12/23 18:10:23

文章目录

  • 前端部分
    • axios配置
    • 请求部分代码
    • 页面代码
  • 后端代码
  • 结果

前端部分

axios配置

主要是一些基础的配置,这里可看可不看,主要的不是这里

import axios from 'axios';
let baseURL = '/demo'

// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项,表示请求URL公共部分
    baseURL: baseURL,
    // 超时
    timeout: 30000,
    // // 禁用 Cookie 等信息
    // withCredentials: false,
});

// request拦截器
service.interceptors.request.use(config => {
    // 避免跨域
    config.headers["Content-Type"] = "application/octet-stream";
    config.headers['Access-Control-Allow-Origin'] = "*";
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
        let url = config.url + '?';
        for (const propName of Object.keys(config.params)) {
            const value = config.params[propName];
            const part = encodeURIComponent(propName) + '='
            if (value !== null && typeof (value) !== "undefined") {
                if (typeof value === 'object') {
                    for (const key of Object.keys(value)) {
                        let params = propName + '[' + key + ']';
                        const subPart = encodeURIComponent(params) + '='
                        url += subPart + encodeURIComponent(value[key]) + "&";
                    }
                } else {
                    url += part + encodeURIComponent(value) + "&";
                }
            }
        }
        url = url.slice(0, -1);
        config.params = {};
        config.url = url;
    }
    return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

export default service;

请求部分代码

最主要的是一个这部分

headers: {
            'Content-Type': 'multipart/form-data'
        },
import request from "@/utils/request";

export function predictSingleImage(data) {
    return request({
        url: '/predictSingle',
        headers: {
            'Content-Type': 'multipart/form-data'
        },
        method: 'post',
        data: data,
    });
}

页面代码

主要是要将获得的文件包装秤FormData()
重要代码就是
let sendData = new FormData()
其中的this.predictForm.file就是获取到的文件

sendData.append(“image”,this.predictForm.file)
这里的"image"需要和后端代码对应上

下面是发起请求的代码

//提交单张图片
    submitSingleImage() {
      let sendData = new FormData();
      sendData.append("image", this.predictForm.file);
      predictSingleImage(sendData).then(res => {
        let response = res.data.result[0];
        //找到response中的最大值即其索引
        let max = response[0];
        let maxIndex = 0;
        for (let i = 1; i < response.length; i++) {
          if (response[i] > max) {
            maxIndex = i;
            max = response[i];
          }
        }
        this.$modal.msgSuccess("预测成功,预测结果为:" + maxIndex);
      }).catch(err => {
        this.$modal.msgError("预测失败" + err);
      })
    },

这里是获取文件的代码

<!-- 前端页面代码 -->
              <el-input placeholder="请选择文件" v-model="predictForm.filename" disabled>
                <template slot="append">
                  <el-button icon="el-icon-folder-opened" @click="openFile">点此上传文件</el-button>
                </template>
              </el-input>
              <input type="file" name="filename" id="open" style="display: none" accept="image/*"
                     @change="changeFile"/>

//这里是methods方法
    //打开文件选择框
    openFile() {
      document.getElementById("open").click();
    },
    //选择文件后,将文件信息存入predictForm
    changeFile() {
      const fu = document.getElementById("open");
      if (fu == null) return;
      //如果文件类型不是图片,则返回
      if (!/image\/\w+/.test(fu.files[0].type)) {
        this.$modal.msgWarning("请确保文件为图像类型");
        return false;
      }
      this.predictForm.file = fu.files[0];
      this.predictForm.filename = fu.files[0].name;
      this.predictForm.fileUrl = window.URL.createObjectURL(this.predictForm.file);
    },

后端代码

重要的是image = request.files[‘image’].read()
这里需要跟上面的“image”对应上

@demo.route('/predictSingle', methods=['POST'])
def predict_single():
    image = request.files['image'].read()
    image = Image.open(io.BytesIO(image))
    image = preprocess(image)
    output = demo_model(image)
    return jsonify({'result': output.detach().numpy().tolist()})

结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山洪灾害预警方案(山洪预警解决方案的组成)

​ 随着气候变化的不断加剧&#xff0c;山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害&#xff0c;我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案&#xff0c;并成功在某地区进行了部署。 案…

【Linux从入门到精通】线程 | 线程介绍线程控制

本篇文章主要对线程的概念和线程的控制进行了讲解。其中我们再次对进程概念理解。同时对比了进程和线程的区别。希望本篇文章会对你有所帮助。 文章目录 一、线程概念 1、1 什么是线程 1、2 再次理解进程概念 1、3 轻量级进程 二、进程控制 2、1 创建线程 pthread_create 2、2…

代码随想录算法训练营第49天|121. 买卖股票的最佳时机,买卖股票的最佳时机II

链接: 121. 买卖股票的最佳时机 链接: 122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出…

代码托管的力量:构建协作、追踪和持续交付的软件开发生态系统

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 在现代软件开发中…

浅析-vue.js

学习目标 会创建Vue实例&#xff0c;知道Vue的常见属性会使用Vue的生命周期的钩子函数会使用vue常见指令会使用vue计算属性和watch监控会编写Vue组件掌握组件间通信了解vue-router使用了解webpack使用会使用vue-cli搭建项目 0.前言 前几天我们已经对后端的技术栈有了初步的了…

Spark_Spark内存模型管理

工作中经常用到Spark内存调参&#xff0c;之前还没对这块记录&#xff0c;这次记录一下。 环境参数 spark 内存模型中会涉及到多个配置&#xff0c;这些配置由一些环境参数及其配置值有关&#xff0c;为防止后面理解混乱&#xff0c;现在这里列举出来&#xff0c;如果忘记了&a…

冠达管理:庄家最怕的8个方法?

在股票商场上&#xff0c;庄家总是短时刻内操控价格&#xff0c;并在一定的时刻内进出股市&#xff0c;以赚取巨额赢利。 假如想在股票商场上盈余&#xff0c;那么就必须站在庄家的对立面&#xff0c;把握一些防护和反击的办法。这里就来介绍一些庄家最怕的办法。 一、技能剖析…

恒运资本:沪指震荡涨0.28%,医药板块强势拉升,金融等板块上扬

15日早盘&#xff0c;沪指盘中震荡上扬&#xff0c;科创50指数表现强势&#xff1b;北向资金小幅净流入。 到午间收盘&#xff0c;沪指涨0.28%报3135.31点&#xff0c;深成指、创业板指涨均0.11%&#xff0c;科创50指数涨1.04%&#xff1b;两市合计成交4357亿元&#xff0c;北…

Java基础语法之数组

&#x1f495;十年生死两茫茫&#xff0c;不思量&#xff0c;自难忘&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java学习之--数组 一.数组的基本概念 1.定义 数组是相同数据类型的集合&#xff01;使用数组来存放多个相同类型的数据&#xff01; 2.Jav…

亚马逊云科技打造SAP核心业务系统上云最佳实践,加快业务转型和价值实现

数字化转型步入深水区&#xff0c;企业竞争日益激烈&#xff0c;乘云而上、快速进行现代化转型和创新&#xff0c;才能不断紧跟趋势变化&#xff0c;实现「高质量发展」。作为亚马逊云科技全球战略合作伙伴&#xff0c;SAP和亚马逊云科技的联合创新已超过15年&#xff0c;双方共…

持续深耕金融科技领域,神策数据正式加入证券基金行业信创联盟

近日&#xff0c;神策数据正式加入证券基金行业信息技术应用创新联盟&#xff08;简称“信创联盟”&#xff09;&#xff0c;携手更多行业力量&#xff0c;促进证券基金行业信创关键技术研究、应用和服务。 证券基金信创联盟由上交所联合行业券商倡议发起成立&#xff0c;由证监…

【计算机视觉 | 图像模型】常见的计算机视觉 image model(CNNs Transformers) 的介绍合集(十)

文章目录 一、GreedyNAS-A二、ASLFeat三、GreedyNAS-B四、Twins-PCPVT五、MoGA-A六、MoGA-C七、Visformer八、Multi-Heads of Mixed Attention九、LocalViT十、SPP-Net十一、The Ikshana Hypothesis of Human Scene Understanding Mechanism十二、DetNASNet十三、TResNet十四、…

thinkphp:查询本周中每天中日期的数据

以今天2023-09-14为例&#xff0c;这一周为2023-09-11~2023-09-07 运行结果 结果&#xff1a; 代码 后端thinkphp: //查询本周每天的的总金额数 //获取本周的起始日期和结束日期 $weekStart date(Y-m-d, strtotime(this week Monday)); $weekEnd date(Y-m-d, strtotime(t…

【Vue】大悟!模板语法-插值语法指令语法

模板语法 Vue模板语法包括两大类 插值语法 插值语法也就是两个大括号&#xff0c;也叫Mustache 功能&#xff1a;用于解析标签体内容&#xff0c;可以进行运算、三元表达式等,将最终解析出来的内容插入到标签中 写法&#xff1a;{{xxx}}&#xff0c;xxx 是 js 表达式&…

RSA算法研究报告

摘 要 分析RSA算法的应用现状&#xff0c;论证文件加密应用RSA算法的可行性和意义。设计一套完整实用的RSA文件加密解决方案&#xff0c;具体编码实现。对RSA算法进行研究&#xff0c;从常规RSA算法出发&#xff0c;用C实现RSA加密算法类库&#xff0c;并在32位windows平台封装…

如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用

推荐&#xff1a;使用NSDT场景编辑器快速搭建3D应用场景 概述 在这篇博文中&#xff0c;引用了几种文件扩展名和模型格式。在开始之前&#xff0c;最好了解以下内容&#xff1a; OBJ – 对象文件&#xff0c;一种标准的 3D 图像格式&#xff0c;可以通过各种 3D 图像编辑程序…

在springboot下将mybatis升级为mybatis-plus

在springboot下将mybatis升级为mybatis-plus 1. 整体描述2. 具体步骤2.1 更新pom引用2.2 更新yml配置2.3 更新config配置2.4 BaseEntity修改 3. 程序启动4. 总结 1. 整体描述 之前项目工程用的是mybatis&#xff0c;现在需要将其替换为mybatis-plus&#xff0c;mybatis-plus的…

实用技巧:Linux上实现OpenGauss数据库远程连接,方便的跨网络数据操作

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 &#x1f341; 小结 &#x1f341; 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许…

解决WIN11笔记本Type-C转DP线外接显示器重启开机没信号无法识别需再次插拔问题

在最新的WIN11系统中&#xff0c;你如果使用Type-C转DP线外接显示器&#xff0c;每次开机的时候或许会出现显示器没有信号的问题。这是因为你的显示器和转接线作为USB外设进入休眠了&#xff0c;导致需要再次插拔才能识别出来&#xff0c;不仅麻烦而且一次次插拔转接线是有磨损…

微信管理系统自动添加好友功能

你是否有这样的困扰&#xff0c;为什么你在添加多个好友的时候&#xff0c;容易添加频繁。你要先知道底层的规则是怎么样的&#xff0c;才能尽可能的去避免添加频繁&#xff0c;加到更多的好友。 微信主动添加好友的规则&#xff1a; ①通过附近人功能加人上限15人/天&#xf…