nginx代理本地服务请求,避免跨域;前端图片压缩并上传

news2024/9/21 3:17:48

痛点

有时用vscode进行一些测试 请求不同端口服务、或者其他服务接口时时,老是会报跨域,非常的烦

所有就想用 nginx 进行请求代理,来解决这个痛点

nginx

下载地址:nginx: download

下载到某一目录:

window下nginx相关命令

//检查 Nginx 配置文件语法是否正确
nginx -t

//启动 Nginx 服务
start nginx

//停止 Nginx 服务
nginx -s stop

//快速关闭并启动 Nginx 服务,用于重新加载配置文件
nginx -s reopen

nginx相关配置

D:\ZDS\nginx\nginx-1.24.0\conf  目录下的nginx.conf


worker_processes  1;

events {
    worker_connections  1024;
}


http {
    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name 127.0.0.1;

        location /service/ {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $proxy_host;
        }
        location / {
            proxy_pass http://127.0.0.1:5501/documentEdit/3.html;
         }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

配置说明:

nginx监听本地http://127.0.0.1/服务 80端口,如果用户访问这个服务端口,会默认代理到http://127.0.0.1:5501/documentEdit/3 .html   服务,也就是打开这个服务,然后在这个服务中,如果请求url中有 ’service‘ 这个字段,那么这个url请求 就会被代理到http://127.0.0.1:8080 接口服务

例如,在5501的服务中,用ajax请求url为:

http://127.0.0.1/service/h5/engin?type=3&projId=13025

那么经过代理就会成为:

http://localhost:8080/service/h5/engin?type=3&projId=13025

配置详情:

worker_processes 1;

这个指令设置了 Nginx 启动时用于处理请求的工作进程数量。在这里,设定为 1 个工作进程

events { ... }

这个块中配置了关于连接处理的一些参数,包括 worker_connections,它定义了每个工作进程可以同时处理的最大连接数

 http { ... }

这是 HTTP 服务器的主要配置块,包括全局的 HTTP 相关设置

endfile on;keepalive_timeout 65;

sendfile on; 开启了文件的高效传输模式,在支持 sendfile 的系统上,可以直接在磁盘和网络之间传输数据,而不需要在用户空间和内核空间之间来回拷贝。

keepalive_timeout 65; 设置了 keepalive 连接的超时时间,即客户端与服务器的长连接的超时时间

server { ... }

这是定义一个 HTTP 服务器的块,在这里配置了该服务器的监听地址、名称等信息

listen 80;server_name 127.0.0.1;

listen 80; 定义了服务器监听的端口号。

server_name 127.0.0.1; 指定了该服务器的域名或 IP 地址

location /service/ { ... }location / { ... }

location /service/ { ... } 定义了对应 URL 路径的请求转发规则,这里将以 "/service/" 开头的请求转发到本地的端口 8080。

location / { ... } 定义了根路径 "/" 的请求转发规则,将请求转发到本地的端口 5501,并指定了具体的页面 "/documentEdit/3.html"。

error_page 500 502 503 504 /50x.html;location = /50x.html { ... }

这里定义了当出现 500、502、503、504 错误时显示的错误页面,并指定了该错误页面的路径。


配置完之后运行 start nginx 命令,然后打开http://127.0.0.1/ ,看能不能成功加载页面出来,如果成功加载出来了,说明配置成功

nginx踩坑

要在 server_name 127.0.0.1 监听的服务中加载到我们需要请求代理的页面,也就是加载到vscode用Live Server运行起来的服务,这样才能进行代理

前端图片压缩并上传

前端进行图片压缩,然后添加到formData中,上传到后台服务

base64转Blob

// 数据 URL 转换为 Blob 对象
                    function dataURLtoBlob(dataURL) {
                        // 使用 atob 函数解码 base64 编码的部分,split(',')[1] 用于获取逗号后的部分,即去掉 data:image/jpeg;base64, 中前面描述图片类型的部分,只留下实际的 base64 编码数据
                        var byteString = atob(dataURL.split(',')[1]);
                        // 用于存储二进制数据
                        var ab = new ArrayBuffer(byteString.length);
                        // 创建了一个无符号 8 位整型数组,引用了上面创建的 ArrayBuffer,用于处理二进制数据
                        var ia = new Uint8Array(ab);
                        // 将 base64 编码转换成二进制数据
                        for (var i = 0; i < byteString.length; i++) {
                            ia[i] = byteString.charCodeAt(i);
                        }
                        // 使用 ArrayBuffer 创建了一个新的 Blob 对象,表示了转换后的图像数据,并指定了其类型为 image/jpeg
                        return new Blob([ab], { type: 'image/jpeg' });
                    }

完整代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片上传和压缩</title>
</head>

<body>
    <input type="file" id="uploadInput" accept="image/*">
    <canvas id="canvas"></canvas>
    <button onclick="compressAndUpload()">压缩并上传</button>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
        integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <script>
        // 获取相关DOM元素
        var uploadInput = document.getElementById('uploadInput');
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');

        // 监听文件选择事件
        uploadInput.addEventListener('change', function () {
            var file = uploadInput.files[0]; // 获取用户选择的文件
            var reader = new FileReader();

            // 文件读取完成时触发
            reader.onload = function (event) {
                var img = new Image();
                img.onload = function () {
                    // 将图片绘制到canvas上
                    var width = img.width;
                    var height = img.height;
                    var ratio = 1;
                    // 若图片宽度或高度超过500像素,则进行压缩
                    if (width > 500 || height > 500) {
                        if (width > height) {
                            ratio = 500 / width;
                        } else {
                            ratio = 500 / height;
                        }
                    }
                    canvas.width = width * ratio;
                    canvas.height = height * ratio;
                    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

                    // 数据 URL 转换为 Blob 对象
                    function dataURLtoBlob(dataURL) {
                        // 使用 atob 函数解码 base64 编码的部分,split(',')[1] 用于获取逗号后的部分,即去掉 data:image/jpeg;base64, 中前面描述图片类型的部分,只留下实际的 base64 编码数据
                        var byteString = atob(dataURL.split(',')[1]);
                        // 用于存储二进制数据
                        var ab = new ArrayBuffer(byteString.length);
                        // 创建了一个无符号 8 位整型数组,引用了上面创建的 ArrayBuffer,用于处理二进制数据
                        var ia = new Uint8Array(ab);
                        // 将 base64 编码转换成二进制数据
                        for (var i = 0; i < byteString.length; i++) {
                            ia[i] = byteString.charCodeAt(i);
                        }
                        // 使用 ArrayBuffer 创建了一个新的 Blob 对象,表示了转换后的图像数据,并指定了其类型为 image/jpeg
                        return new Blob([ab], { type: 'image/jpeg' });
                    }

                    // 输出压缩后的图片数据
                    var compressedData = canvas.toDataURL('image/jpg', 1); // 压缩质量为0.7
                    var formData = new FormData();

                    var blob = dataURLtoBlob(compressedData);
                    formData.append('image', blob, 'image.jpg');

                    $.ajax({
                        url: 'http://127.0.0.1:80/service/h5/engin?type=3&projId=13025',
                        type: 'POST',
                        data: formData,
                        processData: false,
                        contentType: false,
                        success: function (response) {
                            response = JSON.parse(response)
                        },
                        error: function (xhr, status, error) {
                            console.error(error);
                        }
                    });
                }
                img.src = event.target.result;
            }

            reader.readAsDataURL(file); // 以DataURL格式读取文件
        });

    </script>
</body>

</html>

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

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

相关文章

nvm 安装后出现的各种问题解决方法

1、nvm安装后无法安装node版本 首先需要确定删除了电脑上所有的node版本&#xff0c;如果不会卸载那么请移步到 查看 &#xff0c;我们是要通过nvm来下载node环境&#xff0c;所以之前下载的node有冲突&#xff0c;所以都要清除。 2、下载后的nvm环境&#xff0c;无法使用node、…

Apache Airflow (十一) :HiveOperator及调度HQL

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

Django 入门学习总结2 创建一个投票系统

通过学习&#xff0c;我们可以实现一个简单的投票系统。这个投票系统有两部分组成。 公共部分&#xff0c;公众可以查看和进行投票。管理员可以进行增加、删除、修改投票信息。 这里投票系统Python语言版本为3.10.13&#xff0c;Django Web框架版本为4.2.7。 投票系统的实现…

量化交易:借助talib使用技术分析指标

什么是技术分析&#xff1f; 所谓股票的技术分析&#xff0c;是相对于基本面分析而言的。基本分析法着重于对一般经济情况以及各个公司的经营管理状况、行业动态等因素进行分析&#xff0c;以此来研究股票的价值&#xff0c;衡量股价的高低。而技术分析则是透过图表或技术指标…

2023-简单点-树莓派picamera2介绍和要点

picamera2 requirements简介preview windows预览窗口GtGL preview【有 x windwows情况下 硬件加速】Qt preview【软件加速】DRM/KMS preview【没有 x windwows情况下】NULL previewpreview的一些其他特征 配置camera配置的细节 捕捉图像capture images切换模式 requirements简…

Colab跑项目

这里写目录标题 Colab文件目录路径显示更改colab当前工作文件夹Colab挂载谷歌云盘colab使用命令&#xff08;从这开始看&#xff0c;前面no zuo no die)最紧要&#xff0c;首先&#xff0c;修改笔记本设置使用启用gpu![在这里插入图片描述](https://img-blog.csdnimg.cn/591a6c…

Sam Altman重回OpenAI,工牌成亮点

11月20日凌晨&#xff0c;Sam Altman在社交平台发布了一条内容“我第一次&#xff0c;也是最后一次穿这些。”他胸前挂着OpenAI的工牌&#xff0c;写的却是“客人04”。目前&#xff0c;Sam在OpenAI总部。 Sam在19日发了一条内容“我非常喜欢OpenAI团队”。结合微软等主要投资…

html-网站菜单-点击菜单展开相应的导航栏,加减号可切换

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…

typora整理markdown笔记

效果 符号 快捷键 斜体 * * ctrlB(代表同时按) 加粗 ** ** ctrlI 竖线 > 超链接 清除样式 ctrl\ 图片 ![图片描述][图片绝对路径/相对路径] 如何在Typora中插入图像&#xff1f; ➊ 使用Markdown语法 &#xff08;不推荐&#xff0c;太慢&#xff09; ➋ 直接拷贝图…

解决 Python requests 库中 方法选择错误问题

在使用Python库requests进行网页请求时&#xff0c;可能会遇到一个问题&#xff0c;即在处理重定向时&#xff0c;requests的Session.resolve_redirects方法会复制原始请求对象&#xff0c;这可能导致后续请求的HTTP方法选择错误。 解决方案&#xff1a; 针对上述问题&#x…

创建maven项目

创建maven项目 使用命令行创建 mvn archetype:generate如果是第一次创建&#xff0c;这个过程会有点久 之后会提示是否使用7&#xff0c;7是quickstart正常选择默认的就可以了&#xff0c;按回车继续 groupid填写&#xff0c;如果有域名将域名反写即可&#xff0c;如果想随便…

Unity 中 TextMesh Pro 认识学习

TextMesh Pro User Guide | TextMeshPro | 3.0.6官方文档 有两个 TextMesh Pro 组件可用。 第一个 TMP 文本组件的类型为 <TextMeshPro> 旨在与 MeshRenderer 配合使用。该组件是旧版 TextMesh 组件的理想替代品。 要添加新的 <TextMeshPro> 文本对象&#xff…

ModStartCMS v7.6.0 CMS备份恢复优化,主题开发文档更新

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

无痛卸载流氓杀毒软件Avast

文章目录 1\. 引言2\. 操作 1. 引言 与其说Avast是一个杀毒软件&#xff0c;不如说它是一个流氓软件&#xff0c;对于常用的微信QQ也进行拦截&#xff0c;我真的不知道意义何在 此外如果不小心安装上它之后&#xff0c;会出现一个问题&#xff1a;鼠标正常&#xff0c;电脑打字…

医院陪诊服务预约小程序的作用如何

对陪诊服务提供者及需求者来说&#xff0c;平台很重要&#xff0c;对服务提供者而言&#xff0c;通过微信私信/电话联系的形式很容易出现漏服务的情况&#xff0c;如遇需求者内容/地址/联系方式/哪家医院等信息提供不清或临时改变主意等&#xff0c;非常烦恼&#xff0c;同时各…

Redis 学习

Redis 集群共3种集群模式&#xff1a; 1. 主从模式 &#xff08;主写从读&#xff09;&#xff0c;写请求分配到主库&#xff0c;完后数据同步到从库&#xff0c;从库主要负责读请求 同步过程&#xff1a; 从库启动向主库发送同步请求&#xff0c;数据传输的形式是RDB文件&am…

CImage通过WinApi的SetWorldTransform来实现图片旋转

SetWorldTransform的功能是旋转画布&#xff0c;这样产生的效果就是图像旋转。因此&#xff0c;在旋转画布之前&#xff0c;要把要旋转的图像的位置和大小准备好&#xff0c;这样旋转之后&#xff0c;才能使图像正好出现在显示区域内。这需要计算两个关键参数&#xff0c;图像的…

Python编程基础(华为在线课程)

一、免费课程链接 https://e.huawei.com/cn/talent/outPage/#/sxz-course/home?courseId3mCm7X8-UyWyS6pioCSJeUI0yFo 二、学习环境搭建 0、参考文章 搭建 Python 高效开发环境&#xff1a; Pycharm Anaconda - 知乎 1、下载anaconda 官网地址&#xff1a; https://ww…

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍&#xff0c; 基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于单片机、GPS和里程计的轨迹定位和里程统计系统可以被设计成能够在移动的交通工具中精确定位车辆的位置…

淘宝详情api(获取主图)2023年11月20日最新版本

返回数据格式&#xff1a; 请求链接 {"item": {"apiStack": [{"name": "esi","value": "{\"delivery\": {\"from\": \"福建莆田\", \"to\": \"全国\", \"com…