首页 > 其他分享 >Go-embed把静态文件打包到二进制

Go-embed把静态文件打包到二进制

时间:2024-02-18 15:55:05浏览次数:24  
标签:string err song 二进制 answer json Go gin embed

同级目录建立view文件夹。

package main

import (
	"bytes"
	"embed"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"html/template"
	"io/ioutil"
	"net/http"
)

const (
	gptUrl        = "https://api.zhishuyun.com/chatgpt"
	gptToken      = "1111"
	gptImageUrl   = "https://api.zhishuyun.com/midjourney/imagine"
	gptImageToken = "2222"
)

type gptRes struct {
	Answer         string `json:"answer"`
	ConversationId string `json:"conversation_id"`
}

type gptImgRes struct {
	ImageUrl string `json:"image_url"`
}
// 这句话是设置打包
//go:embed view/*
var htmlFS embed.FS

func main() {
	router := gin.Default()
	router.Use(Cors())
	// 设置Gin框架的HTML模板和静态文件路由
	router.Any("/view/*filepath", func(c *gin.Context) {
		staticServer := http.FileServer(http.FS(htmlFS))
		staticServer.ServeHTTP(c.Writer, c.Request)
	})
	// 引入html
	router.SetHTMLTemplate(template.Must(template.New("").ParseFS(htmlFS, "view/*")))

	router.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{})
	})
	//问答
	router.POST("/ask", func(c *gin.Context) {
		msg := c.PostForm("msg")
		song := make(map[string]interface{})
		song["stateful"] = true
		song["question"] = msg
		song["conversation_id"] = ""
		song["timeout"] = 3
		song["retry_times"] = 3
		content := Post(gptUrl, gptToken, song)
		var res gptRes
		var answer string
		err := json.Unmarshal([]byte(content), &res)
		if err != nil {
			answer = err.Error()
		}
		answer = res.Answer

		c.JSON(http.StatusOK, gin.H{
			"answer": answer,
		})
	})
	//图片
	router.POST("/img", func(c *gin.Context) {
		msg := c.PostForm("msg")
		song := make(map[string]interface{})
		song["action"] = "generate"
		song["prompt"] = msg
		song["timeout"] = 300
		song["callback_url"] = ""
		content := Post(gptImageUrl, gptImageToken, song)
		var res gptImgRes
		var answer string
		err := json.Unmarshal([]byte(content), &res)
		if err != nil {
			answer = err.Error()
		}
		answer = res.ImageUrl
		c.JSON(http.StatusOK, gin.H{
			"imageUrl": answer,
		})
	})

	router.Run(":6789")
}

// 发送post请求
func Post(url, secret string, data map[string]interface{}) string {
	client := &http.Client{}
	// 设置请求体,json格式
	bytesData, _ := json.Marshal(data)
	req, err := http.NewRequest("POST", url+"?token="+secret,
		bytes.NewBuffer([]byte(bytesData)))
	if err != nil {
		fmt.Println("Fatal error ", err.Error())
	}

	//设置请求头
	req.Header.Set("content-type", "application/json")
	req.Header.Set("content-type", "application/json")

	resp, err := client.Do(req)
	defer resp.Body.Close()

	content, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err.Error()
	}
	return string(content)
}

func Cors() gin.HandlerFunc {
	return func(context *gin.Context) {
		method := context.Request.Method

		context.Header("Access-Control-Allow-Origin", "*")
		context.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token, x-token")
		context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PATCH, PUT")
		context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
		context.Header("Access-Control-Allow-Credentials", "true")

		if method == "OPTIONS" {
			context.AbortWithStatus(http.StatusNoContent)
		}
	}
}

标签:string,err,song,二进制,answer,json,Go,gin,embed
From: https://www.cnblogs.com/qcy-blog/p/18019427

相关文章

  • go1.22的一些关键改动
    参考汇总文章Go1.22正式发布!包含语言变化、性能提高、标准库变动等重要特性在电脑中安装多个版本的golang由于我的电脑安装的是go的1.21版本,1.22版本改动很大,如果工作中部署的项目dockerFile中指定的镜像的go版本比1.22低的话,有一些语法会编译不通过,所以我在官方下载了.gz格式......
  • 《程序是怎样跑起来的》——第2章 数据使用二进制数表示的
    一、程序的运行机制与二进制数的关系1、程序的运行机制:要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。2、二进制数的作用:在C和Java等高级语言编写的程序中,数值、字符串和图像等信息在计算机内部都是......
  • ls -l 第一位 文件类型 gokcehan/lf 颜色
    SymbolFileType–regularfileddirectorylsymboliclinkpnamedpipeccharacterdevice, e.g.,/dev/tty1bblockdevice, e.g.,/dev/sda2ssocket  默认lf颜色主要取自GNUdircolors默认值。这些默认值使用8种基本颜色和粗......
  • 基于python+django+mysql的小区物业管理系统
    该系统是基于python+django开发的小区物业管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。主要功能有:业主管理、报修管理、停车管理、资产管理、小区管理、用户管理、日志管理、系统信息。演示地址http://wuye.gitapp.cn/admin后......
  • 《程序是怎样跑起来的》用二进制来理解数据
    一,计算机用二进制处理信息的原因原因:CPU是一种集成电路,计算机内部均由集成电路构成集成电路所有的引脚都有直流电压0v或者加5v两种状态处理信息的单位:最小的单位是比特有一位最基本的单位是字节有八位数据的处理:101110转化为八进制是00101110[在最高位增零,以此类推]......
  • Gorm与数据库
    本篇是对上一篇博客的继续补充(当然也可以视作独立的一篇)。友情提示,本篇博客中用到了数据库可视化工具Navicat。另外,本篇博客的所有代码都可以从这里获取。建立大致项目结构Gorm是一个可以操作数据库的框架。为了更方便观察对数据库的操作,我们先建立一个基础从项目结构:只有一个......
  • Go语言指南练习:图像
    题目:还记得之前编写的图片生成器吗?我们再来编写另外一个,不过这次它将会返回一个image.Image的实现而非一个数据切片。定义你自己的Image类型,实现必要的方法并调用pic.ShowImage。Bounds应当返回一个image.Rectangle,例如image.Rect(0,0,w,h)。ColorModel应当返回color.RGBAM......
  • 中端知识和工具+字符设备和块设备+LMA和VMA+gdb查看系统调用+vim查看指定文件链接的au
    中端知识和工具https://www.cnblogs.com/yjw951012/p/12865036.html抖动(Jitter)和偏移(skew)信号周期的长度总会有一定变化,从而导致下一个沿的到来时间不确定。这种不确定就是抖动(jitter)。因时钟线长度不同或负载不同,导致时钟到达相邻单元的时间不同,这个时间上的偏差就叫时钟偏......
  • Asp.Net Core访问阿里云MongoDB云数据库
    Asp.NetCore访问阿里云MongoDB云数据库选择.NetCore技术栈开发跨平台软件解决方案,投入少,产出快,有助于企业内部降本增效。MongoDB的实体类增加字段不用迁移数据库,适合需求经常变化的应用场景。如果是企业内部小型应用,拉一个MongoDB容器即可,如果要进一步考虑多节点冗余,高可用,异地......
  • 创新技巧|迁移到 Google Analytics 4 时如何保存历史 Universal Analytics 数据
    GoogleUniversalAnalytics从2023年7月起停止收集数据(除了付费GA360之外)。它被GoogleAnalytics4取代。为此,不少用户疑惑:是否可以将累积(历史)数据从GoogleAnalyticsUniversal传输到GoogleAnalytics4?您无法将数据传输到新的GA4界面。但您可以将数据保存在Goog......