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


    痛点

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

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

    nginx

    下载地址:nginx: download

    下载到某一目录:

    window下nginx相关命令

    1. //检查 Nginx 配置文件语法是否正确
    2. nginx -t
    3. //启动 Nginx 服务
    4. start nginx
    5. //停止 Nginx 服务
    6. nginx -s stop
    7. //快速关闭并启动 Nginx 服务,用于重新加载配置文件
    8. nginx -s reopen

    nginx相关配置

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

    1. worker_processes 1;
    2. events {
    3. worker_connections 1024;
    4. }
    5. http {
    6. sendfile on;
    7. keepalive_timeout 65;
    8. server {
    9. listen 80;
    10. server_name 127.0.0.1;
    11. location /service/ {
    12. proxy_pass http://127.0.0.1:8080;
    13. proxy_set_header Host $proxy_host;
    14. }
    15. location / {
    16. proxy_pass http://127.0.0.1:5501/documentEdit/3.html;
    17. }
    18. error_page 500 502 503 504 /50x.html;
    19. location = /50x.html {
    20. root html;
    21. }
    22. }
    23. }

    配置说明:

    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

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

    完整代码

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>图片上传和压缩title>
    7. head>
    8. <body>
    9. <input type="file" id="uploadInput" accept="image/*">
    10. <canvas id="canvas">canvas>
    11. <button onclick="compressAndUpload()">压缩并上传button>
    12. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
    13. integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
    14. crossorigin="anonymous" referrerpolicy="no-referrer">script>
    15. <script>
    16. // 获取相关DOM元素
    17. var uploadInput = document.getElementById('uploadInput');
    18. var canvas = document.getElementById('canvas');
    19. var ctx = canvas.getContext('2d');
    20. // 监听文件选择事件
    21. uploadInput.addEventListener('change', function () {
    22. var file = uploadInput.files[0]; // 获取用户选择的文件
    23. var reader = new FileReader();
    24. // 文件读取完成时触发
    25. reader.onload = function (event) {
    26. var img = new Image();
    27. img.onload = function () {
    28. // 将图片绘制到canvas上
    29. var width = img.width;
    30. var height = img.height;
    31. var ratio = 1;
    32. // 若图片宽度或高度超过500像素,则进行压缩
    33. if (width > 500 || height > 500) {
    34. if (width > height) {
    35. ratio = 500 / width;
    36. } else {
    37. ratio = 500 / height;
    38. }
    39. }
    40. canvas.width = width * ratio;
    41. canvas.height = height * ratio;
    42. ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
    43. // 数据 URL 转换为 Blob 对象
    44. function dataURLtoBlob(dataURL) {
    45. // 使用 atob 函数解码 base64 编码的部分,split(',')[1] 用于获取逗号后的部分,即去掉 data:image/jpeg;base64, 中前面描述图片类型的部分,只留下实际的 base64 编码数据
    46. var byteString = atob(dataURL.split(',')[1]);
    47. // 用于存储二进制数据
    48. var ab = new ArrayBuffer(byteString.length);
    49. // 创建了一个无符号 8 位整型数组,引用了上面创建的 ArrayBuffer,用于处理二进制数据
    50. var ia = new Uint8Array(ab);
    51. // 将 base64 编码转换成二进制数据
    52. for (var i = 0; i < byteString.length; i++) {
    53. ia[i] = byteString.charCodeAt(i);
    54. }
    55. // 使用 ArrayBuffer 创建了一个新的 Blob 对象,表示了转换后的图像数据,并指定了其类型为 image/jpeg
    56. return new Blob([ab], { type: 'image/jpeg' });
    57. }
    58. // 输出压缩后的图片数据
    59. var compressedData = canvas.toDataURL('image/jpg', 1); // 压缩质量为0.7
    60. var formData = new FormData();
    61. var blob = dataURLtoBlob(compressedData);
    62. formData.append('image', blob, 'image.jpg');
    63. $.ajax({
    64. url: 'http://127.0.0.1:80/service/h5/engin?type=3&projId=13025',
    65. type: 'POST',
    66. data: formData,
    67. processData: false,
    68. contentType: false,
    69. success: function (response) {
    70. response = JSON.parse(response)
    71. },
    72. error: function (xhr, status, error) {
    73. console.error(error);
    74. }
    75. });
    76. }
    77. img.src = event.target.result;
    78. }
    79. reader.readAsDataURL(file); // 以DataURL格式读取文件
    80. });
    81. script>
    82. body>
    83. html>

  • 相关阅读:
    教你买了新电脑后的基础设置要怎么做
    【Node.js】定时任务cron:
    编译rk3588_buildroot报错
    Linux下例行性工作自结
    设备树添加版本信息
    Android红外功能模拟触摸鼠标事件唤醒屏幕
    斗鱼主播查询易语言代码
    零基础自学游戏开发和软件开发先学什么知识点或课程?
    leetcode:53. 最大子数组和
    OpenGait:首个步态识别框架开源了!
  • 原文地址:https://blog.csdn.net/weixin_52479803/article/details/134280960