1. package main
  2.  
  3. import (
  4. "io/ioutil"
  5. "os"
  6. "io"
  7. "log"
  8. "net/http"
  9. )
  10.  
  11. const (
  12. UPLOAD_DIR = "./upload"
  13. )
  14.  
  15. func main(){
  16. http.HandleFunc("/",listHandler)
  17. http.HandleFunc("/upload",uploadHandler)
  18. http.HandleFunc("/view",viewHandler)
  19. err := http.ListenAndServe("127.0.0.1:8080",nil)
  20.  
  21. if err != nil {
  22. log.Fatal("ListenAndServe:", err.Error())
  23. }
  24. }
  25.  
  26. func uploadHandler(w http.ResponseWriter, r *http.Request) {
  27.  
  28. if r.Method == "GET" {
  29. io.WriteString(w,"<html><form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">" +
  30. "Choose an image to upload: <input name=\"image\" type=\"file\" />" +
  31. "<input type=\"submit\" value=\"Upload\" /></form></html>")
  32. }
  33.  
  34. if r.Method == "POST" {
  35.  
  36. f,h,err := r.FormFile("image")
  37.  
  38. if err != nil {
  39. http.Error(w,err.Error(),http.StatusInternalServerError)
  40. return
  41. }
  42.  
  43. filename := h.Filename
  44. defer f.Close()
  45.  
  46. t,err := os.Create(UPLOAD_DIR + "/" + filename)
  47.  
  48. if err != nil {
  49. http.Error(w,err.Error(),http.StatusInternalServerError)
  50. return
  51. }
  52.  
  53. defer t.Close()
  54.  
  55. if _,err := io.Copy(t,f); err != nil {
  56. http.Error(w,err.Error(),http.StatusInternalServerError)
  57. return
  58. }
  59.  
  60. http.Redirect(w,r,"/view?id="+filename,http.StatusFound)
  61. }
  62.  
  63. return
  64. }
  65.  
  66. func viewHandler(w http.ResponseWriter, r *http.Request){
  67.  
  68. id := r.FormValue("id")
  69. path := UPLOAD_DIR + "/" + id
  70.  
  71. if !hasfile(path) {
  72. http.NotFound(w,r)
  73. return
  74. }
  75.  
  76. w.Header().Set("Content-Type","image")
  77. http.ServeFile(w,r,path)
  78. }
  79.  
  80. func hasfile(path string) bool {
  81.  
  82. _,err := os.Stat(path)
  83. if err == nil {
  84. return true
  85. }
  86.  
  87. return os.IsExist(err)
  88. }
  89.  
  90. func listHandler(w http.ResponseWriter, r *http.Request){
  91. fileInfo,err := ioutil.ReadDir("./upload")
  92.  
  93. if err != nil {
  94. http.Error(w,err.Error(),http.StatusInternalServerError)
  95. return
  96. }
  97.  
  98. var html string
  99. html += "<html><ol>"
  100. for _,info := range fileInfo {
  101. id := info.Name()
  102. html += "<li><a href=\"view?id=" + id + "\">" + id + "</a></li>"
  103. }
  104. html += "</ol></html>"
  105.  
  106. io.WriteString(w,html)
  107. }

## 简单的图片管理网站

Go.网络篇-2的更多相关文章

  1. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

  2. iOS开发网络篇—监测网络状态(转)

    文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...

  3. iOS开发网络篇—大文件的多线程断点下载

    http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...

  4. iOS开发网络篇—简单介绍ASI框架的使用

    iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...

  5. iOS开发网络篇—网络编程基础

    iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...

  6. iOS开发网络篇—搭建本地服务器

    iOS开发网络篇—搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...

  7. iOS开发网络篇—HTTP协议

    iOS开发网络篇—HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...

  8. iOS开发网络篇—NSURLConnection基本使用

    iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...

  9. iOS开发网络篇—GET请求和POST请求

    iOS开发网络篇—GET请求和POST请求 一.GET请求和POST请求简单说明 创建GET请求 // 1.设置请求路径 NSString *urlStr=[NSString stringWithFo ...

  10. iOS开发网络篇—数据安全

    iOS开发网络篇—数据安全 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题. 如:可以利用软件(比如Charles)设 ...

随机推荐

  1. 【Linux】CentOS7上解压zip需要安装uzip

    1.安装zip.unzip应用 yum install zip unzip 2.压缩和解压文件 以下命令均在/home目录下操作 cd /home #进入/home目录 a.把/home目录下面的my ...

  2. maven 引入外部jar包

    方式1:dependency 本地jar包 <dependency> <groupId>com.hope.cloud</groupId> <!--自定义--& ...

  3. IE9以下不支持placeholder属性

    jquery.placeholder.min.js 这个js可以去这个网站搜索https://www.bootcdn.cn/jquery-placeholder/ 使用这个jquery.placeho ...

  4. 十,PHP下载文件

    1,文件类型 (1)文本文件,如xx.txt. (2)二进制文件,如图片.视频.音频. 2,文件下载流程如下图所示,首先浏览器向服务器发送下载请求,服务器将下载资源读入内存,再通过http将资源返回到 ...

  5. 前端-chromeF12 谷歌开发者工具详解 Network篇

    开发者工具初步介绍 chrome开发者工具最常用的四个功能模块: Elements:主要用来查看前面界面的html的Dom结构,和修改css的样式.css可以即时修改,即使显示.大大方便了开发者调试页 ...

  6. Python 中的 10 个常见安全漏洞,以及如何避免(下)

    简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...

  7. TCP/IP——何时用UDP代替TCP

    UDP和TCP UDP和TCP都有其自身的特点,不同的应用场景和要求需要使用不同的协议来传输,那么何时我们可以用UDP代替TCP呢. UDP 的优点 UDP支持广播和多播,事实上如果应用程序使用广播或 ...

  8. oracle for update for update nowait

    对数据进行查询操作后,或提示ORA-00054错误,这时选定行的资源被占用,资源正忙.其他程序或者用户在占用着此行数据或者此表. 直接查询. select * from A1 t  ; 此时取到的数据 ...

  9. python高级(二)—— python内置序列类型

    本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...

  10. leetcode 53 最大子序列之和(动态规划)

    思路:nums为给定的数组,动态规划: 设 一维数组:dp[i] 表示 以第i个元素为结尾的一段最大子序和. 1)若dp[i-1]小于0,则dp[i]加上前面的任意长度的序列和都会小于nums[i], ...