提前说明一下:代码参考了《Go语言编程》,稍有变动, 自己亲自玩了一遍。

之前玩过go web server, 现在来用go来搭建一个简单的图片上传网站, 工作目录是:~/photoweb , 而~/photoweb/uploads用来存图片,代码photoweb.go在~/photoweb目录下。

看服务器代码, ~/photoweb/photoweb.go的内容为:

package mainimport ("io""os""log""net/http"
)const (UPLOAD_DIR = "./uploads"
)func uploadHandler(w http.ResponseWriter, r *http.Request) {if r.Method == "GET" {str := `<html><head><meta charset="utf-8"><title>Upload</title></head><body><form method="POST" action="/upload" enctype="multipart/form-data">Choose an image to upload: <input name="image" type="file" /><input type="submit" value="Upload" /></form></body></html>`io.WriteString(w, str)}// 处理图片上传if r.Method == "POST" {f, h, err := r.FormFile("image")if err != nil {http.Error(w, err.Error(),http.StatusInternalServerError)return}filename := h.Filenamedefer f.Close()t, err := os.Create(UPLOAD_DIR + "/" + filename)if err != nil {http.Error(w, err.Error(),http.StatusInternalServerError)return}defer t.Close()if _, err := io.Copy(t, f); err != nil {http.Error(w, err.Error(),http.StatusInternalServerError)return}}}func main() {http.HandleFunc("/upload", uploadHandler)err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("ListenAndServe: ", err.Error())}
}

在浏览器中执行:http://127.0.0.1:8080/upload

后台代码进入GET分支, 给浏览器端返回一段html代码,展示成html元素, 供用户上传图片, 选择图片, 点击Upload按钮上传后, 后台代码进入POST分支, 于是把图片存到了~/photoweb/uploads中。实际check了一下, 该目录下果然有此图片。

为了便于在浏览器上直接查看上传的图片, 可以修改下服务器代码, 增加Redirect, 如下:

package mainimport ("io""os""log""net/http"
)const (UPLOAD_DIR = "./uploads"
)func uploadHandler(w http.ResponseWriter, r *http.Request) {if r.Method == "GET" {str := `<html><head><meta charset="utf-8"><title>Upload</title></head><body><form method="POST" action="/upload" enctype="multipart/form-data">Choose an image to upload: <input name="image" type="file" /><input type="submit" value="Upload" /></form></body></html>`io.WriteString(w, str)}// 处理图片上传if r.Method == "POST" {f, h, err := r.FormFile("image")if err != nil {http.Error(w, err.Error(),http.StatusInternalServerError)return}filename := h.Filenamedefer f.Close()t, err := os.Create(UPLOAD_DIR + "/" + filename)if err != nil {http.Error(w, err.Error(),http.StatusInternalServerError)return}defer t.Close()if _, err := io.Copy(t, f); err != nil {http.Error(w, err.Error(),http.StatusInternalServerError)return}http.Redirect(w, r, "/view?id="+filename, http.StatusFound)}}func isExists(path string) bool {_, err := os.Stat(path)if err == nil {return true}return os.IsExist(err)
}func viewHandler(w http.ResponseWriter, r *http.Request) {imageId := r.FormValue("id")imagePath := UPLOAD_DIR + "/" + imageIdif exists := isExists(imagePath); !exists {http.NotFound(w, r)return}w.Header().Set("Content-Type", "image")http.ServeFile(w, r, imagePath)
}func main() {http.HandleFunc("/view", viewHandler)http.HandleFunc("/upload", uploadHandler)err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("ListenAndServe: ", err.Error())}
}

重启服务,重新访问http://127.0.0.1:8080/upload, 然后选择图片, 点击Upload上传, 结果在服务器对应的目录中有该图片, 且在浏览器中显示了该图片。

如上代码很简单, 我之前在Apatch下写过类似的图片上传服务器, 道理基本相同。

好了, 不多说。

用go来搭建一个简单的图片上传网站相关推荐

  1. python自动上传图片_使用Python实现一个简单的图片上传存储服务

    使用flask实现的一个简单的图片上传服务 设计初衷 对于图片的存储,有很多选择,一般采用云服务如(七牛,又拍等),但是国内的服务像七牛 自定义域名竟然需要域名备案(Excuse me,当初就是因为备 ...

  2. 一步一步搭建一个图片上传网站(后台服务器用nodejs)

    前几天看了腾讯云社区的一个文件上传的文章 <文件上传那些事儿> ,大体上讲了以下h5中图片上传的几个核心原理,但是没有后端接受的服务器代码,没法做测试.也没有具体的一个实例都是一些基本的原 ...

  3. 一步一步搭建一个图片上传网站(后台服务器用nodejs) 1

    前几天看了腾讯云社区的一个文件上传的文章文件上传那些事儿,大体上讲了以下h5中图片上传的几个核心原理,但是没有后端接受的服务器代码,没法做测试.也没有具体的一个实例都是一些基本的原理片段,并且ui界面 ...

  4. 一个.net6简单的图片上传(文件也可用)

    #一个.net6简单的图片上传(文件也可用) ##页面 @{ViewData["Title"] = "图片上传Demo"; }<form asp-acti ...

  5. 用jsp实现简单的图片上传功能

    用jsp实现简单的图片上传功能 1 先做一个页面,选择上传的图片 <body><form action="uploadServlet" enctype=" ...

  6. alert()的功能_前端实现简单的图片上传小图预览功能

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  7. bootstrap-fileinput的简单使用(图片上传和编辑)

    简介: 一款非常优秀的HTML5文件上传插件,支持bootstrap 3.x 和4.x版本,具有非常多的特性:多文件选择.这个插件能最简单的帮你完成文件上传功能,且使用bootstrap样式.还支持多 ...

  8. [ckeditor系列]ckeditor 自己写的一个简单的image上传js 运用iframe的ajax上传

    ckeditor最近修改一个上传的,原来的Image的上传插件功能很多,但是自己用,没有必要,就进行了修改,后来就改成了目前的样子,根据_samples/api_dialog.html 进行了修改,把 ...

  9. tp3.2简单的图片上传实现

    //定义文件上传相关目录常量 define('ROOT_PATH', __DIR__); define('UPLOAD_PATH', '/Public/Uploads/'); //现在model封装一 ...

最新文章

  1. 金士顿u盘量产工具_与时俱进,金士顿双接口优盘支持Type C接口
  2. Android 实用工具Hierarchy Viewer实战
  3. mysql char 和varchar哪种效率高_MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?...
  4. C++LU decomposition(LU分解)的实现算法(附完整源码)
  5. WeChat区别this.setData()与this.setData({})
  6. 老生常谈:工厂模式兄弟姐妹
  7. Writing your first Django app--Django 第一步
  8. 给Visual Studio Code的文件夹和文件替换图标
  9. 分析函数在数据分析中的应用
  10. oracle秘钥到期,Oracle – 更新加入 – 非密钥保留表
  11. linux修改网卡名(亲测有效)
  12. 如何获取.then的返回值_仅仅知道如何终止XHR请求,或许对你来说是不够的!
  13. 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
  14. pythonjava有什么区别_Python与JAVA有何区别?
  15. FineReport如何手动推送APP消息
  16. 2017 Multi-University Training Contest - Team 10
  17. windows 多开微信
  18. 准备学python用什么电脑_超准《IQ测试》,在线《智商测试》
  19. Photoshop简单案例(8)——利用文字工具修改图片上文字
  20. 小程序生成二维码,正方形二维码,跟小程序码

热门文章

  1. Java复习之抽象类和接口
  2. mybatis不区分大小写问题
  3. 结合d3.js实现气象数据的可视化
  4. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类
  5. 1.python自动化登录12306
  6. 中国橱柜行业品牌营销策略与竞争态势研究报告2022版
  7. 现在捡芝麻都需要有见识吗?
  8. ATJ2157内存篇【炬芯音频芯片】---sct语法
  9. 【转】刘润:不要和没有逻辑的人讨论业务
  10. 手机安装linux模拟器教程,Ubuntu下安装Android模拟器