Golang(go语言)http上传图片和显示图片

转载自:https://aiezu.com/article/go_image_upload_and_show.html

package main;
import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "path"
    "net/http"
    "errors"
    "strings"
)
 
func main() {
    http.HandleFunc("/upload/", uploadHandle) // 上传
    http.HandleFunc("/uploaded/", showPicHandle)  //显示图片
    err := http.ListenAndServe(":80", nil)
    fmt.Println(err)
}
 
// 上传图像接口
func uploadHandle (w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/html")
 
    req.ParseForm()
    if req.Method != "POST" {
        w.Write([]byte(html))
    } else {
        // 接收图片
        uploadFile, handle, err := req.FormFile("image")
        errorHandle(err, w)
 
        // 检查图片后缀
        ext := strings.ToLower(path.Ext(handle.Filename))
        if ext != ".jpg" && ext != ".png" {
            errorHandle(errors.New("只支持jpg/png图片上传"), w);
            return
            //defer os.Exit(2)
        }
 
        // 保存图片
        os.Mkdir("./uploaded/", 0777)
        saveFile, err := os.OpenFile("./uploaded/" + handle.Filename, os.O_WRONLY|os.O_CREATE, 0666);
        errorHandle(err, w)
        io.Copy(saveFile, uploadFile);
 
        defer uploadFile.Close()
        defer saveFile.Close()
        // 上传图片成功
        w.Write([]byte("查看上传图片: <a target='_blank' href='/uploaded/" + handle.Filename + "'>" + handle.Filename + "</a>"));
    }
}
 
// 显示图片接口
func showPicHandle( w http.ResponseWriter, req *http.Request ) {
    file, err := os.Open("." + req.URL.Path)
    errorHandle(err, w);
 
    defer file.Close()
    buff, err := ioutil.ReadAll(file)
    errorHandle(err, w);
    w.Write(buff)
}
 
// 统一错误输出接口
func errorHandle(err error, w http.ResponseWriter) {
    if  err != nil {
        w.Write([]byte(err.Error()))
    }
}
 
const html = `<html>
    <head></head>
    <body>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="image" />
            <input type="submit" />
        </form>
    </body>
</html>`

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您实现这个功能。首先,我需要确认一下您的开发环境是否已经准备好了,包括 Go 编译器和相关的依赖库。 接下来,我将为您提供一个简单的代码示例,用于创建一个 API 服务并实现用户信息的增删改查功能。同时,该示例还包含了图片上传的功能,使用了 Gin 框架和 GORM ORM 库。 以下是示例代码: ```go package main import ( "fmt" "net/http" "os" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) type User struct { gorm.Model Name string `json:"name"` Gender string `json:"gender"` Description string `json:"description"` Avatar string `json:"avatar"` } func main() { // 初始化数据库连接 db, err := gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local") if err != nil { fmt.Println("database connect error:", err) os.Exit(1) } defer db.Close() // 创建用户表 db.AutoMigrate(&User{}) // 创建 Gin 实例 router := gin.Default() // 添加用户接口 router.POST("/users", func(c *gin.Context) { // 解析请求参数 var user User if err := c.BindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 保存用户信息 if err := db.Create(&user).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, user) }) // 查询用户接口 router.GET("/users/:id", func(c *gin.Context) { // 获取用户 ID id := c.Param("id") // 查询用户信息 var user User if err := db.First(&user, id).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, user) }) // 更新用户接口 router.PUT("/users/:id", func(c *gin.Context) { // 获取用户 ID id := c.Param("id") // 查询用户信息 var user User if err := db.First(&user, id).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } // 解析请求参数 var updateUser User if err := c.BindJSON(&updateUser); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 更新用户信息 user.Name = updateUser.Name user.Gender = updateUser.Gender user.Description = updateUser.Description user.Avatar = updateUser.Avatar if err := db.Save(&user).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, user) }) // 删除用户接口 router.DELETE("/users/:id", func(c *gin.Context) { // 获取用户 ID id := c.Param("id") // 删除用户信息 if err := db.Delete(&User{}, id).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "delete success"}) }) // 上传图片接口 router.POST("/upload", func(c *gin.Context) { // 从请求中获取文件 file, err := c.FormFile("file") if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 保存文件到本地 filename := fmt.Sprintf("uploads/%s", file.Filename) if err := c.SaveUploadedFile(file, filename); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"url": filename}) }) // 启动服务 router.Run(":8080") } ``` 在这个示例中,我们首先定义了一个 User 结构体,包含了我们要存储的用户信息。然后,我们使用 GORM 库创建了一个数据库连接,并在其中创建了一个用户表。 接着,我们使用 Gin 框架创建了四个 API 接口,分别用于添加、查询、更新和删除用户信息。其中,添加、更新和查询用户信息的接口都使用了 BindJSON 方法来解析请求参数,并使用 GORM 库来持久化用户信息到数据库中。 最后,我们还添加了一个用于上传图片的接口,使用了 Gin 框架的 FormFile 方法来获取上传的文件,并使用 SaveUploadedFile 方法将文件保存到本地。 请注意,由于这个示例中的数据库连接字符串中包含了敏感信息,因此在实际使用中,您需要将其替换为您自己的数据库连接字符串。 希望这个示例能够帮助到您,如果您有任何问题或需要进一步的帮助,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值