package main

import (
"io/ioutil"
"os"
"io"
"log"
"net/http"
) const (
UPLOAD_DIR = "./upload"
) func main(){
http.HandleFunc("/",listHandler)
http.HandleFunc("/upload",uploadHandler)
http.HandleFunc("/view",viewHandler)
err := http.ListenAndServe("127.0.0.1:8080",nil) if err != nil {
log.Fatal("ListenAndServe:", err.Error())
}
} func uploadHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" {
io.WriteString(w,"<html><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></html>")
} if r.Method == "POST" { f,h,err := r.FormFile("image") if err != nil {
http.Error(w,err.Error(),http.StatusInternalServerError)
return
} filename := h.Filename
defer 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)
} return
} func viewHandler(w http.ResponseWriter, r *http.Request){ id := r.FormValue("id")
path := UPLOAD_DIR + "/" + id if !hasfile(path) {
http.NotFound(w,r)
return
} w.Header().Set("Content-Type","image")
http.ServeFile(w,r,path)
} func hasfile(path string) bool { _,err := os.Stat(path)
if err == nil {
return true
} return os.IsExist(err)
} func listHandler(w http.ResponseWriter, r *http.Request){
fileInfo,err := ioutil.ReadDir("./upload") if err != nil {
http.Error(w,err.Error(),http.StatusInternalServerError)
return
} var html string
html += "<html><ol>"
for _,info := range fileInfo {
id := info.Name()
html += "<li><a href=\"view?id=" + id + "\">" + id + "</a></li>"
}
html += "</ol></html>" io.WriteString(w,html)
}

## 简单的图片管理网站

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. 如果使用安卓4.4的SD卡?

    安卓4.4默认情况下,后安装的程序无权写入数据到SD卡中,那么是否我们就不能用了?看了很多文章,都说要Root,随后修改配置文件.我觉得这不是很好的方法,Root之后的安卓会有很大风险,这不是最好的办 ...

  2. coffee主题美化内容概要

    1.具备自动生浮动标题目录(可隐藏) 2.页首目录概要 3.主标题有明显的标志背景颜色,二级标题缩进合适 4.一级.二级标题下图片缩进合适 5.博客签名 6.背景音乐列表 7.打赏 8.联系方式(QQ ...

  3. 【OCP-052】新版052最新题库及答案整理-第14题

    14.Which command is used to display files that no longer conform to the backup retention policy? A) ...

  4. UML图基础

    UML(Unified Model Language)统一建模语言,是对象管理组织(OMG)制定的一个通用的.可视化的建模标准语言,可以用来可视化.描述.构造和文档化软件密集型系统的各种工作.在学习设 ...

  5. [ActionScript 3.0] AS3 ServerSocket示例(官方示例)

    下面的示例创建一个套接字服务器.要使用该服务器,可将套接字绑定到本地端口,然后从其他应用程序连接到该端口.该服务器仅识别 UTF-8 字符串. package { import flash.displ ...

  6. android开发如何获取res/raw和assets文件夹的路径

    ---恢复内容开始--- android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况: 1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以, ...

  7. PyQt5(1)——Qt Designer初探

    相关环境配置我们就不介绍了(网上有很多教程) Qt Designer 是一款十分强大的GUI工具,生成的文件为 .UI文件  可以通过命令转化为Py文件,简单来说我们可以通过拖拽方式生成界面,在通过简 ...

  8. tableView下沉

    出现问题的界面如下,并附有大致介绍: 而我想做的界面应该是自定义的headerView和tableView是一起滑动的,而不是headerView在tableView滑动的时候始终在顶部位置,而且ta ...

  9. jquery offset()和position()的区别

    <script src="jquery/jquery-3.3.1.min.js"></script> <script type="text/ ...

  10. mybatis的CRUD实例(四)

    接下来我们来实现新增用户功能: 一.新增用户 这里我们使用的sql为:insert into user(username,birthday,sex,address) values ("lwj ...