图的遍历

article/2025/10/28 19:12:57

图的遍历

介绍

是从图的某一顶点出发,按照某种搜索方式对图中所有顶点访问一次且仅一次。图的遍历可以解决很多搜索问题,在实际中应用非常广泛。图的遍历根据搜索方式的不同,分为广度优先搜索深度优先搜索。

一.深度优先遍历

1.1介绍

深度优先搜索(Depth First Search, DFS)是最常见的图搜索方法之一。深度优先搜索沿着一条路径一直走下去,无法行进时,回退到刚刚访问的节点,似“不撞南墙不回头,不到黄河不死心”。深度优先遍历是按照深度优先搜索的方式对图进行遍历。
深度优先遍历秘籍:后被访问的顶点,其邻接点先被访问。
根据深度优先遍历秘籍,后来先服务,可以借助于实现。递归本身就是使用栈实现的,因此使用递归方法更方便。

举例

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

代码实现1—深度优先遍历邻接矩阵

//深度优先遍历  邻接矩阵
#include <iostream>
using namespace std;#define MaxVnum 100  //顶点数最大值
bool visited[MaxVnum];  //访问标志数组,其初值为"false"
typedef char VexType;  //顶点的数据类型,根据需要定义
typedef int EdgeType;  //边上权值的数据类型,若不带权值的图,则为0或1
typedef struct {VexType Vex[MaxVnum];EdgeType Edge[MaxVnum][MaxVnum];int vexnum, edgenum; //顶点数,边数
}AMGragh;int locatevex(AMGragh G, VexType x)
{for (int i = 0; i < G.vexnum; i++)//查找顶点信息的下标if (x == G.Vex[i])return i;return -1;//没找到
}void CreateAMGraph(AMGragh& G)//创建无向图的邻接矩阵
{int i, j;VexType u, v;cout << "请输入顶点数:" << endl;cin >> G.vexnum;cout << "请输入边数:" << endl;cin >> G.edgenum;cout << "请输入顶点信息:" << endl;for (int i = 0; i < G.vexnum; i++)//输入顶点信息,存入顶点信息数组cin >> G.Vex[i];for (int i = 0; i < G.vexnum; i++)//初始化邻接矩阵所有值为0,如果是网,则初始化邻接矩阵为无穷大for (int j = 0; j < G.vexnum; j++)G.Edge[i][j] = 0;cout << "请输入每条边依附的两个顶点:" << endl;while (G.edgenum--){cin >> u >> v;i = locatevex(G, u);//查找顶点u的存储下标j = locatevex(G, v);//查找顶点v的存储下标if (i != -1 && j != -1)G.Edge[i][j] = G.Edge[j][i] = 1; //邻接矩阵储置1,若有向图G.Edge[i][j]=1else{cout << "输入顶点信息错!请重新输入!" << endl;G.edgenum++;//本次输入不算}}
}void print(AMGragh G)//输出邻接矩阵
{cout << "图的邻接矩阵为:" << endl;for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++)cout << G.Edge[i][j] << "\t";cout << endl;}
}void DFS_AM(AMGragh G, int v)//基于邻接矩阵的深度优先遍历
{int w;cout << G.Vex[v] << "\t";visited[v] = true;for (w = 0; w < G.vexnum; w++)//依次检查v的所有邻接点{if (G.Edge[v][w] && !visited[w])//v,w邻接且w未被访问{DFS_AM(G, w);//从w顶点开始递归深度优先遍历}}
}//如果不是一个连通图,还需要进行验证.
void DFS_AM(AMGragh G)
{for (int i = 0; i < G.vexnum; i++)//检查未被访问的顶点{if (!visited[i]){DFS_AM(G, i);}}
}int main()
{int v;VexType c;AMGragh G;CreateAMGraph(G);print(G);cout << "请输入遍历连通图的起始点: ";cin >> c;v = locatevex(G, c);//查找顶点u的存储下标if (v != -1){cout << "深度优先搜索遍历连通图结果: " << endl;DFS_AM(G);}else {cout << "输入顶点信息错误!请重新输入!" << endl;}return 0;
}

运行结果1

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

在这里插入图片描述

代码实现2—深度优先遍历 邻接表

//深度优先遍历  邻接表
#include <iostream>
using namespace std;const int MaxVnum = 100;//顶点数最大值
bool visited[MaxVnum];  //访问标志数组,其初值为"false"
typedef char VexType;//顶点的数据类型为字符型typedef struct AdjNode { //定义邻接点类型int v; //邻接点下标struct AdjNode* next; //指向下一个邻接点
}AdjNode;typedef struct VexNode { //定义顶点类型VexType data; // VexType为顶点的数据类型,根据需要定义AdjNode* first; //指向第一个邻接点
}VexNode;typedef struct {//定义邻接表类型VexNode  Vex[MaxVnum];int vexnum, edgenum; //顶点数,边数
}ALGragh;int locatevex(ALGragh G, VexType x)
{for (int i = 0; i < G.vexnum; i++)//查找顶点信息的下标if (x == G.Vex[i].data)return i;return -1;//没找到
}void insertedge(ALGragh& G, int i, int j)//插入一条边
{AdjNode* s;s = new AdjNode;s->v = j;s->next = G.Vex[i].first;G.Vex[i].first = s;
}void printg(ALGragh G)//输出邻接表
{cout << "----------邻接表如下:----------" << endl;for (int i = 0; i < G.vexnum; i++){AdjNode* t = G.Vex[i].first;cout << G.Vex[i].data << ": ";while (t != NULL){cout << "---->";cout << "[" << G.Vex[t->v].data << "]";t = t->next;}cout << endl;}
}
void CreateALGraph(ALGragh& G)//创建无向图邻接表
{int i, j;VexType u, v;cout << "请输入顶点数和边数:" << endl;cin >> G.vexnum >> G.edgenum;cout << "请输入顶点信息:" << endl;for (i = 0; i < G.vexnum; i++)//输入顶点信息,存入顶点信息数组cin >> G.Vex[i].data;for (i = 0; i < G.vexnum; i++)G.Vex[i].first = NULL;cout << "请依次输入每条边的两个顶点u,v" << endl;while (G.edgenum--){cin >> u >> v;i = locatevex(G, u);//查找顶点u的存储下标j = locatevex(G, v);//查找顶点v的存储下标if (i != -1 && j != -1){insertedge(G, i, j);//insertedge(G, j, i);//无向图多插入一条边}else{cout << "输入顶点信息错!请重新输入!" << endl;G.edgenum++;//本次输入不算}}
}void DFS_AL(ALGragh G, int v)//基于邻接表的深度优先遍历
{int w;AdjNode* p;//辅助指针cout << G.Vex[v].data << "\t";visited[v] = true;p = G.Vex[v].first;//获取该顶点的第一个邻接点while (p)//依次检查v的所有邻接点{w = p->v;//w为v的邻接点.if (!visited[w])//w未被访问,则从w出发,递归深度优先遍历{DFS_AL(G, w);}p = p->next;}
}void DFS_AL(ALGragh G) //非连通图,基于邻接表的深度优先遍历
{for(int i = 0; i < G.vexnum; i++)//检查未被访问的点.if (!visited[i]){DFS_AL(G, i);}
}int main()
{ALGragh G;int v;VexType c;CreateALGraph(G);//创建有向图邻接表printg(G);//输出cout << "请输入遍历连通图的起始点: ";cin >> c;v = locatevex(G, c);if (v != -1){cout << "深度优先搜索遍历连通图结果: " << endl;DFS_AL(G, v);DFS_AL(G);}else{cout << "输入顶点信息错误!请重新输入!" << endl;}return 0;
}

运行结果2

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

在这里插入图片描述

算法分析

  1. 基于邻接矩阵的DFS算法
    查找每个顶点的邻接点需要O(n)时间,一共n个顶点,总的时间复杂度为O(n^2),使用了一个递归工作栈,空间复杂度为O(n)。
  2. 基于邻接表的DFS算法
    查找顶点vi的邻接点需要O(d(vi))时间,d(vi)为vi的出度(无向图为度),对有向图而言,所有顶点的出度之和等于边数e,对无向图而言,所有顶点的度之和等于2e,因此查找邻接点的时间复杂度为O(e),加上初始化时间O(n),总的时间复杂度为O(n+e),(由于n和e大小未知,所以时间复杂度两者都涉及)使用了一个递归工作栈,空间复杂度为O(n)。

二.广度优先遍历

2.1介绍

广度优先搜索(Breadth First Search, BFS),又称宽度优先搜索,是最常见的图搜索方法之一。广度优先搜索是从某个顶点(源点)出发,一次性访问所有未被访问的邻接点,再依次从这些访问过的邻接点出发……似水中涟漪,一层层地传播开来.

举例

在这里插入图片描述
在这里插入图片描述
广度优先遍历秘籍:先被访问的顶点,其邻接点先被访问。
根据广度优先遍历秘籍,先来先服务,可以借助于队列实现。每个节点访问一次且只访问一次,因此可以设置一个辅助数组visited[i]=false,表示第i个顶点未访问;visited[i]=true,表示第i个顶点已访问。

代码实现1—广度优先遍历邻接矩阵

#include <iostream>
#include <queue>//引入队列头文件
using namespace std;#define MaxVnum 100  //顶点数最大值
bool visited[MaxVnum];  //访问标志数组,其初值为"false"
typedef char VexType;  //顶点的数据类型,根据需要定义
typedef int EdgeType;  //边上权值的数据类型,若不带权值的图,则为0或1
typedef struct {VexType Vex[MaxVnum];EdgeType Edge[MaxVnum][MaxVnum];int vexnum, edgenum; //顶点数,边数
}AMGragh;int locatevex(AMGragh G, VexType x)
{for (int i = 0; i < G.vexnum; i++)//查找顶点信息的下标if (x == G.Vex[i])return i;return -1;//没找到
}void CreateAMGraph(AMGragh& G)//创建有向图的邻接矩阵
{int i, j;VexType u, v;cout << "请输入顶点数:" << endl;cin >> G.vexnum;cout << "请输入边数:" << endl;cin >> G.edgenum;cout << "请输入顶点信息:" << endl;for (int i = 0; i < G.vexnum; i++)//输入顶点信息,存入顶点信息数组cin >> G.Vex[i];for (int i = 0; i < G.vexnum; i++)//初始化邻接矩阵所有值为0,如果是网,则初始化邻接矩阵为无穷大for (int j = 0; j < G.vexnum; j++)G.Edge[i][j] = 0;cout << "请输入每条边依附的两个顶点:" << endl;while (G.edgenum--){cin >> u >> v;i = locatevex(G, u);//查找顶点u的存储下标j = locatevex(G, v);//查找顶点v的存储下标if (i != -1 && j != -1)G.Edge[i][j] = G.Edge[j][i] = 1; //邻接矩阵储置1,若无向图G.Edge[i][j]=G.Edge[j][i]=1else{cout << "输入顶点信息错!请重新输入!" << endl;G.edgenum++;//本次输入不算}}
}void print(AMGragh G)//输出邻接矩阵
{cout << "图的邻接矩阵为:" << endl;for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++)cout << G.Edge[i][j] << "\t";cout << endl;}
}void BFS_AM(AMGragh G, int v)
{int u, w;queue<int> Q;//创建一个队列,里面存放节点的下标cout << G.Vex[v] << "\t";visited[v] = true;Q.push(v);//源点v入队while (!Q.empty()){u = Q.front();//取对头Q.pop();for (w = 0; w < G.vexnum; w++)//一次检查u的所有邻接点{if (G.Edge[u][w] && !visited[w])//是邻接点但没有访问则进行访问{cout << G.Vex[w] << "\t";visited[w] = true;Q.push(w);}}}
}void BFS_AM(AMGragh G){for(int i = 0; i < G.vexnum; i++){if(!visited[i]){BFS_AM(G,i); }}
}int main()
{int v;VexType c;AMGragh G;CreateAMGraph(G);print(G);cout << "请输入遍历连通图的起始点: ";cin >> c;v = locatevex(G, c);//查找顶点u的存储下标if (v != -1){cout << "广度优先搜索遍历连通图结果: " << endl;BFS_AM(G, v);BFS_AM(G);}else {cout << "输入顶点信息错! 请重新输入!" << endl;}return 0;
}

运行结果1

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

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

代码实现2—广度优先遍历邻接表

#include <iostream>
#include <queue>//引入队列头文件
using namespace std;const int MaxVnum = 100;//顶点数最大值
bool visited[MaxVnum];  //访问标志数组,其初值为"false"
typedef char VexType;//顶点的数据类型为字符型typedef struct AdjNode { //定义邻接点类型int v; //邻接点下标struct AdjNode* next; //指向下一个邻接点
}AdjNode;typedef struct VexNode { //定义顶点类型VexType data; // VexType为顶点的数据类型,根据需要定义AdjNode* first; //指向第一个邻接点
}VexNode;typedef struct {//定义邻接表类型VexNode  Vex[MaxVnum];int vexnum, edgenum; //顶点数,边数
}ALGragh;int locatevex(ALGragh G, VexType x)
{for (int i = 0; i < G.vexnum; i++)//查找顶点信息的下标if (x == G.Vex[i].data)return i;return -1;//没找到
}void insertedge(ALGragh& G, int i, int j)//插入一条边
{AdjNode* s;s = new AdjNode;s->v = j;s->next = G.Vex[i].first;G.Vex[i].first = s;
}void printg(ALGragh G)//输出邻接表
{cout << "----------邻接表如下:----------" << endl;for (int i = 0; i < G.vexnum; i++){AdjNode* t = G.Vex[i].first;cout << G.Vex[i].data << ": ";while (t != NULL){cout << "---->";cout << "[" << G.Vex[t->v].data << "]";t = t->next;}cout << endl;}
}void CreateALGraph(ALGragh& G)//创建有向图邻接表
{int i, j;VexType u, v;cout << "请输入顶点数和边数:" << endl;cin >> G.vexnum >> G.edgenum;cout << "请输入顶点信息:" << endl;for (i = 0; i < G.vexnum; i++)//输入顶点信息,存入顶点信息数组cin >> G.Vex[i].data;for (i = 0; i < G.vexnum; i++)G.Vex[i].first = NULL;cout << "请依次输入每条边的两个顶点u,v" << endl;while (G.edgenum--){cin >> u >> v;i = locatevex(G, u);//查找顶点u的存储下标j = locatevex(G, v);//查找顶点v的存储下标if (i != -1 && j != -1)insertedge(G, i, j);else{cout << "输入顶点信息错!请重新输入!" << endl;G.edgenum++;//本次输入不算}}
}void BFS_AL(ALGragh G, int v)//基于邻接表的广度优先遍历
{int u, w;AdjNode* p;queue<int> Q;cout << G.Vex[v].data << "\t";visited[v] = true;Q.push(v);while (!Q.empty()){u = Q.front();//取对头元素Q.pop();p = G.Vex[u].first;while (p){w = p->v;if (!visited[w])//w未被访问{cout << G.Vex[w].data << "\t";visited[w] = true;Q.push(w);}p = p->next;}}
}void BFS_AL(ALGragh G)//非连通图,基于邻接表的广度优先遍历
{for (int i = 0; i < G.vexnum; i++)//查漏点.{if (!visited[i])//未被访问则进行访问{BFS_AL(G, i);}}
}int main()
{ALGragh G;int v;VexType c;CreateALGraph(G);//创建有向邻接表printg(G);//输出cout << "请输入遍历连通图的起始点: ";cin >> c;v = locatevex(G, c);//查找顶点u的存储下标if (v != -1){cout << "广度优先搜索遍历连通图结构: " << endl;BFS_AL(G, v);BFS_AL(G);}else{cout << "输入顶点错!请重新输入!" << endl;}return 0;
}

运行结果2

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

算法分析

  1. 基于邻接矩阵的BFS算法
    查找每个顶点的邻接点需要O(n)时间,一共n个顶点,总的时间复杂度为O(n^2),使用了一个辅助队列,最坏的情况下每个顶点入队一次(访问完就入队),空间复杂度为O(n)。
  2. 基于邻接表的BFS算法
    查找顶点vi的邻接点需要O(d(vi))时间,d(vi)为vi的出度(无向图为度),对有向图而言,所有顶点的出度之和等于边数e,对无向图而言,所有顶点的度之和等于2e,因此查找邻接点的时间复杂度为O(e),加上初始化时间O(n),总的时间复杂度为O(n+e),使用了一个辅助队列,最坏的情况下每个顶点入队一次,空间复杂度为O(n)。

总结

  1. 容易发现,广度优先和深度优先的算法效率基本相同,在实际应用中要根据需要合理选择.
  2. 需要注意的是,一个图的邻接矩阵是唯一的,因此基于邻接矩阵的BFS或DFS遍历序列也是唯一的。而图的邻接表不是唯一的,边的输入顺序不同,正序或逆序建表都会影响邻接表的邻接点顺序,因此基于邻接表的BFS或DFS遍历序列不是唯一的。

http://chatgpt.dhexx.cn/article/Ay5J6Nyu.shtml

相关文章

视频和图片合成软件,简单快速合成视频和图片

怎么把小视频和图片合成起来&#xff1f;有简单好上手的教程吗&#xff1f;今天就教大家简单几步&#xff0c;把视频和图片合成为照片视频。先看看用数码大师合成视频和图片的效果截图&#xff1a; 第一步&#xff1a;把图片一次性导入&#xff0c;为照片配上文字 点击“添加…

多张图片怎么合成gif?

多张图片怎么合成gif&#xff1f;gif动图是我们比较熟悉的一种网络聊天表情包&#xff0c;通常都是由图片或者视频转换而来的。很多小伙伴会选择用PS来制作GIF动图&#xff0c;但并不是所有小伙伴都会使用PS&#xff0c;所以一个自动简单&#xff0c;可以将图片或者视频直接转换…

android将图片做成视频播放,如何把图片做成视频【图文教程】

教你怎么将手机拍摄的一张张图片整合转换成视频播放更唯美。下面以直走婚纱mv电子相册为例。 安装好软件&#xff0c;先运行绿化程序&#xff0c;然后再运行软件&#xff0c;详情请参看使用说明txt文档。打开之后&#xff0c;有两个模式供你选择&#xff0c;左边是标准模式、右…

php把图片合成视频,如何把照片做成视频 照片音乐视频制作 并插入几段短视频片段...

如何把照片制作成视频&#xff1f;相信大家都已经有所耳闻了&#xff0c;把平时手机或者相机上拍摄的照片&#xff0c;还有拍摄的视频都可以合起来&#xff0c;再添加背景音乐就成了一个非常有纪念价值的视频了。然而已经不是只有照片和音乐的视频了&#xff0c;整个视频全是照…

视频转图片-人脸识别-合成视频

视频转图片-人脸识别-合成视频 代码&#xff1a; import cv2 import os,sys import numpy as npface_xml cv2.CascadeClassifier(r"C:\Users\lenovo\Desktop\python\jiqixuexi\haarcascade_frontalface_default.xml") eye_xml cv2.CascadeClassifier(r"C:\U…

怎样用计算机合并视频,电脑视频合并软件 , 怎样把多个视频合成为一个

昨天小编在搜梁博的歌曲《表态》的视频时(这首歌小编觉得真的很好听推荐下)在一个剪辑视频发现他将梁博在某综艺唱的歌曲全都剪辑在视频里。这里就运用到了一个剪辑视频知识&#xff0c;合并视频。既然看到小编就准备跟大家伙讲讲这个视频剪辑内容。如何把多个视频合并在一个视…

php合成视频特效,视频合并加转场效果

热爱视频后期剪辑的朋友都会知道&#xff0c;在视频的后期制作过程中&#xff0c;常见操作中就有视频合并这一项&#xff0c;及在视频之间加入转场效果&#xff0c;为影视编辑作品带来绚丽多彩的视觉效果&#xff0c;不禁会使人眼前一亮。接下来给大家介绍一款简易好用的视频编…

php 图片生成视频,图片转化为视频的方法 如何将照片制作成为视频

点击上方的下载地址&#xff0c;然后将软件进行安装。安装完毕后&#xff0c;打开软件在这个界面可以选择软件的比例大小和操作模式&#xff0c;我们选择“4:3”和“全功能模式”。 接着我们将要进行操作的图片导入到软件&#xff0c;点击“导入”后在“打开”界面选中所有的图…

ffmpeg使用(多个帧合成视频)

帧生成视频命令&#xff1a; ffmpeg -threads 2 -y -r 24 -i %05d.jpg output.mp4 视频生成帧命令&#xff08;按帧生成图片&#xff09;&#xff1a; ffmpeg -i checkpoints_dstt_car-turn_result.mp4 chaifen/%06d.png 1、下载ffmpeg安装包 https://github.com/BtbN/FFmpe…

matlab jpg合成gif,用MATLAB将照片合成视频或者GIF图片、以及Photoshop制作GIF图片

用MATLAB将照片合成视频或者GIF图片、以及Photoshop制作GIF图片 一、用MATLAB将照片合成视频(我使用的MATLAB是2015版本的) (1)、你需要需要合成视频的图片。 所有照片放在一个文件夹里面因为是使用Matlab的dir函数读取照片,所以读取时,你要先设置好文件名:图片名称按照“00…

FFmpeg初探——基于FFmpeg的图片合成视频

前言 商家在发布商品的时候&#xff0c;大部分情况下是没有视频的&#xff0c;这样往往会造成商品展示不全等问题&#xff0c;而视频制作又比较麻烦&#xff0c;为了解决此痛点&#xff0c;我们需要提供一键合成视频的功能。 之所以选择 FFmpeg&#xff0c;是因为我们期望后续能…

视频照片合成软件哪个好?快速把手机照片做成视频,简单操作,效果精美!

视频照片合成软件哪个好&#xff1f;怎么把照片合成视频&#xff1f;如何快速把手机照片做成视频&#xff1f; 这是我用数码大师把手机照片合成视频的效果截图&#xff1a; 第一步&#xff1a;快速导入多张照片&#xff0c;为照片配上文字 点击“添加相片”就能快速导入照片…

ffmpeg图片+音频合成视频

命令如下&#xff0c;个人纪录 ffmpeg -framerate 0.05 -f image2 -loop 1 -y -i d:/img/img%d.jpg -i d:/img/gyz.mp3 -s 1080*1920 -r 25 -t 100 d:/img/output.mp4 -framerate 速率&#xff0c;越小每张图片停留时间越长 -loop 循环一遍文件夹内的图片 -i 图片路径&#x…

用php把图片合成视频,图片音乐合成视频 多张图片合成视频|图片合成视频软件...

在网络上我们经常见到的电子相册其本质就是图片音乐合成视频&#xff0c;使用一些图片合成视频软件将多张图片合成视频&#xff0c;外加点炫酷的转场特效&#xff0c;so easy的就能完成了。o(*≧▽≦)ツ 想不想知道具体的操作过程&#xff1f;有兴趣的童鞋可以看看下文的~ 这是…

电脑图片合成视频用什么软件?3分钟快速教程,多张图片做成精美视频!

电脑图片合成视频怎么做&#xff1f;图片视频制作用什么软件好&#xff1f;现在大家的照片或图片很多&#xff0c;其实在电脑上把图片做成视频是非常方便的&#xff0c;还能整理好照片&#xff0c;节省空间&#xff0c;图片/照片视频看起来也更加美观。今天直接用数码大师教大家…

当请求类型是octet-stream时,SpringBoot 如何完成文件上传

一、问题背景 这个问题困扰了我一上午&#xff0c;搜索了很多博客&#xff0c;发现网上的springboot都是使用Multipart来接收文件&#xff0c;而客户端使用的是binary&#xff0c;用二进制流来上传文件的&#xff0c;下面记录一下我的解决历程。 二、基础知识 一个请求的参数…

No converter for [class xxx] Content-Type ‘appliction/octet-stream;charset=UTF-8‘ 的解决办法

报错的类&#xff1a;AbstractMessageConverterMethodProcessor 报错的代码块 报错原因 respose在被传入其他的方法后&#xff0c;其content type 被篡改了&#xff0c;导致与request 的content type 不一致导致的 解决方案一&#xff1a;将方法直接return null; 解决方案二&…

vue2后端返回application/octet-stream这个类型的文件,前端实现下载。

描述&#xff1a;调用接口以后&#xff0c;后台返回的数据 前端实现&#xff0c;下载功能。 前端打印res&#xff1a; 那么接口必须加上这个 页面下载&#xff1a; downloadFunc(data) {const date new Date(new Date() 8 * 3600 * 1000).toISOString().replace(/T/g, ).re…

处理Nginx返回octet-stream数据流的配置

解决 修改Nginx的配置将add_header Content-length 0&#xff1b;删除&#xff0c;处理 Content-Type为application/octet-stream 一、请求报文 二、异常信息 对应前端页面的异常信息为&#xff1a; Network Error epoll_wait() reported that client prematurely closed c…

请求状态为200,前端报系统出错,后端日志报“Content type ‘application/octet-stream‘not supported“错误

请求后端出现"Content type application/octet-stream‘not supported“错误 错误描述&#xff1a; Content type application/octet-stream‘not supported&#xff0c;即内容类型‘application/octet-stream’不支持。 而我们传的参数需要application/octet-stream类型…