IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 图片从前端回传到后端实现思路总结 -> 正文阅读

[JavaScript知识库]图片从前端回传到后端实现思路总结

一、实现思路

1.前端单独写一个转图片的组件imageUpload.vue,并设置路由/imageUpload,当访问地址http://10.18.0.200:8081/imageUpload 时,调用imageUpload.vue组件。当前项目的运行地址http://10.18.0.200:8081

2.后端向前端推送消息topic,同时后端(服务器端)启动浏览器进程打开一个新页面,模拟地址栏地址中输入http://10.18.0.200:8081/imageUpload请求----即调用了imageUpload.vue组件初始化,进行了websocket连接)。因为是后端启动的浏览器进程,所以在前端(浏览器端)看来并没有打开新页面,用户感知不到。但是测试的时候你可以通过自己 访问http://10.18.0.200:8081/imageUpload 来进行测试

3.imageUpload.vue中的逻辑

1)定义一个websocket,订阅后端推送的消息topic(消息里有转图片需要的原始数据),一旦接收到后端返回的数据,就放在一个数组todoList中

2)当监听到todoList的变化时,将数据转换成转图片需要的数据,转成图片,将图片(formData的格式)回传给后端

3)每次处理完一条数据就从todoList删除第一条数据,当有数据时每次都取第一条数据进行2)中的处理

二、代码

注:此处只提供前端向后端传图片思路的大致框架,不能正常运行。转图片的代码未提供,还需整理。

<template>
  <div>
    <!--转图片组件 省略传参之类的,此处只提供思路-->
    <MakeImage class="makeImage"></MakeImage>
  </div>
</template>
<script>
// 转图片组件
import MakeImage from "@/projects/comen/vteWorkstation/riskAssessment/MakeImage";
// 回传图片接口、获取mqtt连接地址、用户名和密码的接口
import { _uploadAssessmentImage, _getEMQ } from "@/api/riskAssessmentAPI.js";
import mqtt from "mqtt";
export default {
  data() {
    return {
      // 定义websocket
      websocket: null,
      // 需要回传的队列
      todoList: [],
    };
  },
  async mounted() {
    console.log("imageUpload mounted");
    // 获取连接信息
    let connectMessage = await this.getEMQ();
    console.log("connetMessage", connectMessage);
    let wsUrl = connectMessage.url;
    let options = {
      username: connectMessage.username,
      password: connectMessage.password,
    };
    console.log("connect url:", wsUrl, options);
    this.websocket = mqtt.connect(wsUrl, options);
    // 重连
    this.websocket.on("reconnect", (error) => {
      console.log("正在重连:", error);
    });
    // 建立连接,订阅主题
    this.websocket.on("connect", () => {
      // 订阅 回传评估结果的主题
      this.websocket.subscribe("vte/asset/report", (error) => {
        if (error) {
          console.log("error:", err);
        } else {
          console.log("回传评估结果 sub success");
        }
      });
    });
    // 连接失败
    this.websocket.on("error", (error) => {
      console.log("连接失败:", error);
    });
    // 接收到服务器消息时
    this.websocket.on("message", (topic, message) => {
      console.log("websocket message", JSON.parse(message.toString()), topic);
      // 获取评估结果
      let assessmentReport = JSON.parse(message.toString());
      this.todoList.push(assessmentReport);
    });
    // 关闭连接时
    this.websocket.on("close", () => {
      console.log("close");
    });
  },
  methods: {
    //获取mqtt连接地址、用户名和密码
    getEMQ({ commit }) {
      return new Promise((resolve, reject) => {
        _getEMQ().then((res) => {
          const { data } = res;
          commit("SETMQCONFIG", JSON.parse(data));
          resolve(JSON.parse(data));
        });
      });
    },
    //  获取转图片所需数据
    async getImageData(todoData) {
      // 数据处理,处理为转图片需要的数据
    },
    // 回传图片
    uploadAssessmentImage(imageobject) {
      console.log("imageobject", imageobject);
      let params = {
        bucket: "test",
      };
      _uploadAssessmentImage(imageobject.formdata, params)
        .then((result) => {
          this.todoList.shift();
        })
        .catch((error) => {
          console.log("error", error);
          this.todoList.shift();
        });
    },
    //生成图片
    async createImages(todoData) {
      //  获取转图片所需数据
      await this.getImageData(todoData);
      //   转图片
      let imageDoms = document.getElementsByClassName("makeImage");
      // 兼容有多条数据同时需要转图片的情况
      Object.keys(imageDoms).map(async (item, index) => {
        console.log("imageDoms", item, index, imageDoms[index]);
        // 调用转图片方法生成图片
        await imageDoms[index]["__vue__"].handlePrint(index);
      });
    },
  },
  watch: {
    todoList: {
      async handler(newval) {
        console.log("todoList", newval, newval.length);
        //队列里有数据再回传
        if (newval.length > 0) {
          console.log("回传评估结果图片");
          //获取转图像需要的数据
          await this.createImages([newval[0]]);
        }
      },
    },
  },
};
</script>

/*

感谢chl的指导!

希望对你有帮助!

如有错误,欢迎指正!非常感谢!

*/

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 10:46:47  更:2022-04-23 10:47:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:27:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码