首页 > 其他分享 >使用GoLang新建一个Go web file 文件服务

使用GoLang新建一个Go web file 文件服务

时间:2022-10-23 20:26:17浏览次数:50  
标签:web http nil err GoLang file go gin

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/satori/go.uuid"
	"io"
	"net/http"
	"os"
	"path"
)

const (
	//最大上传 100M
	SR_File_Max_Bytes = 1024 * 1024 * 100
	//目录
	saveDir = "/home/go-file/"
	httpUrl = "http://***:8090"
	httpDir = "/static"
)

func main() {
	router := gin.Default()
	//本地上传到服务器 csv格式,其他类似 读取内容
	router.POST("/upload", uploadFile)

	router.StaticFS(httpDir, http.Dir(saveDir))

	// 默认启动的是 8080端口,也可以自己定义启动端口
	router.Run(":8090")
}

func uploadFile(c *gin.Context) {
	rFile, err := c.FormFile("file")
	if err != nil {
		c.JSON(
			http.StatusOK, gin.H{
				"rsCode": 999,
				"body":     nil,
				"msg":    "文件格式错误",
			},
		)
		return
	}

	if rFile.Size > SR_File_Max_Bytes {
		c.JSON(
			http.StatusOK, gin.H{
				"rsCode": 999,
				"body":     nil,
				"msg":    "文件大小超过100M",
			},
		)
		return
	}

	file, err := rFile.Open()
	if err != nil {
		c.JSON(
			http.StatusOK, gin.H{
				"rsCode": 999,
				"body":     nil,
				"msg":    "文件格式错误",
			},
		)
		return
	}

	// 生成文件名 uuid  //获取文件名带后缀
	fileName := uuid.NewV4().String() + path.Ext(rFile.Filename)
	// 拼接保存路径
	savePath := saveDir + fileName
	//打开目录
	localFileInfo, fileStatErr := os.Stat(saveDir)
	//目录不存在
	if fileStatErr != nil || !localFileInfo.IsDir() {
		//创建目录
		errByMkdirAllDir := os.MkdirAll(saveDir, 0755)
		if errByMkdirAllDir != nil {
			c.JSON(http.StatusOK, gin.H{
				"rsCode": 999,
				"body":     saveDir,
				"msg": "创建目录失败",
			})
			return
		}
	}
	out, err := os.Create(savePath)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"rsCode": 999,
			"body":     saveDir,
			"msg": "保存文件失败",
		})
		return
	}
	defer out.Close()
	_, err = io.Copy(out, file)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"rsCode":  999,
			"body":    savePath,
			"msg": err.Error(),
		})
		return
	}

	//没有错误的情况下
	c.JSON(http.StatusOK, gin.H{
		"rsCode": 0,
		"body":   httpUrl + httpDir + "/" + fileName,
		"msg":    "上传成功",
	})
	return
}

打包成可在linux运行的文件

$ set GOARCH=amd64
$ set GOOS=linux

开发完成,构建打包为一个名为go-file的文件

$ go build -o go-file main.go

上传go-file到服务器

加权限成可执行文件,输出日志到file.log,并置后台&

$ chmod 755 go-file
$ ./go-file > file.log &


标签:web,http,nil,err,GoLang,file,go,gin
From: https://www.cnblogs.com/bigsheng15/p/16819324.html

相关文章

  • NETCORE - WebSocket通信
    NETCORE-WebSocket通信 webscoket 通信 一般为 客户端与服务端通信,如需两个服务端通信,可把其中一个服务端模拟成客户端。项目框架 vue+.net6 创建NET6 的......
  • Web前端8
    4.HTML版本下面是HTML的历史版本:版本发布时间HTML1991HTML+1993HTML2.01995HTML3.21997HTML4.011999XHTML1.02000HTML52012XHTML52013......
  • Web前端8
    5.Web浏览器......
  • Web前端10
    HTML网页结构下面是HTML文档的基本结构,前面我们已经做了示例代码的展示:......
  • webpack学习
    目录什么是webpack?什么是构建工具?为什么要用webpack?webpack的核心配置Entryoutputloaderpluginsmodewebpack打包命令小结:webpack配置信息样板基本配置信息react项目中路径......
  • Golang:3.8、Golang包 package
    3.8、Golang包packageGolang包的定义和导入通常,文件夹名称和包名称相同,并且,同一个文件夹下面只有一个包定义包service/user_service.gopackageservice导入包mai......
  • Golang:4.1、Golang 并发编程-协程
    4.1、Golang并发编程-协程共语言中的并发是函数相互独立运行的能力。goroutines是并发运行的函数创建协程gotask()示例1packagemainimport("fmt""t......
  • uWebSockets.js 遇见 Http3
    HTTP/3引入运行在UDP上的新(不同)传输协议QUIC意味着理论上和目前实验上的延迟减少,目前标准已发布,在开始之前可以参阅《​​​​WebSockets和HTTP​​》​​uWebSockets.......
  • 在使用Nacos作为统一配置中心的时候,项目中使用@Value注解从Nacos获取值,一直报错Could
    在使用Nacos作为统一配置中心的时候,项目中使用@Value注解从Nacos获取值,一直报错Couldnotresolveplaceholder'blog.website'invalue"${blog.website}".如下图:问题分析......
  • 在使用Nacos作为统一配置中心的时候,项目中使用@Value注解从Nacos获取值,一直报错Could
    在使用Nacos作为统一配置中心的时候,项目中使用@Value注解从Nacos获取值,一直报错Couldnotresolveplaceholder'blog.website'invalue"${blog.website}".如下图:问题......