Go.网络篇-2
- 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的更多相关文章
- iOS开发网络篇—数据缓存
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
- iOS开发网络篇—监测网络状态(转)
文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...
- iOS开发网络篇—大文件的多线程断点下载
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...
- iOS开发网络篇—简单介绍ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- iOS开发网络篇—网络编程基础
iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...
- iOS开发网络篇—搭建本地服务器
iOS开发网络篇—搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...
- iOS开发网络篇—HTTP协议
iOS开发网络篇—HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...
- iOS开发网络篇—NSURLConnection基本使用
iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...
- iOS开发网络篇—GET请求和POST请求
iOS开发网络篇—GET请求和POST请求 一.GET请求和POST请求简单说明 创建GET请求 // 1.设置请求路径 NSString *urlStr=[NSString stringWithFo ...
- iOS开发网络篇—数据安全
iOS开发网络篇—数据安全 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题. 如:可以利用软件(比如Charles)设 ...
随机推荐
- 【Linux】CentOS7上解压zip需要安装uzip
1.安装zip.unzip应用 yum install zip unzip 2.压缩和解压文件 以下命令均在/home目录下操作 cd /home #进入/home目录 a.把/home目录下面的my ...
- maven 引入外部jar包
方式1:dependency 本地jar包 <dependency> <groupId>com.hope.cloud</groupId> <!--自定义--& ...
- IE9以下不支持placeholder属性
jquery.placeholder.min.js 这个js可以去这个网站搜索https://www.bootcdn.cn/jquery-placeholder/ 使用这个jquery.placeho ...
- 十,PHP下载文件
1,文件类型 (1)文本文件,如xx.txt. (2)二进制文件,如图片.视频.音频. 2,文件下载流程如下图所示,首先浏览器向服务器发送下载请求,服务器将下载资源读入内存,再通过http将资源返回到 ...
- 前端-chromeF12 谷歌开发者工具详解 Network篇
开发者工具初步介绍 chrome开发者工具最常用的四个功能模块: Elements:主要用来查看前面界面的html的Dom结构,和修改css的样式.css可以即时修改,即使显示.大大方便了开发者调试页 ...
- Python 中的 10 个常见安全漏洞,以及如何避免(下)
简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...
- TCP/IP——何时用UDP代替TCP
UDP和TCP UDP和TCP都有其自身的特点,不同的应用场景和要求需要使用不同的协议来传输,那么何时我们可以用UDP代替TCP呢. UDP 的优点 UDP支持广播和多播,事实上如果应用程序使用广播或 ...
- oracle for update for update nowait
对数据进行查询操作后,或提示ORA-00054错误,这时选定行的资源被占用,资源正忙.其他程序或者用户在占用着此行数据或者此表. 直接查询. select * from A1 t ; 此时取到的数据 ...
- python高级(二)—— python内置序列类型
本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...
- leetcode 53 最大子序列之和(动态规划)
思路:nums为给定的数组,动态规划: 设 一维数组:dp[i] 表示 以第i个元素为结尾的一段最大子序和. 1)若dp[i-1]小于0,则dp[i]加上前面的任意长度的序列和都会小于nums[i], ...