golang文件上传和下载
//下载(支持断电续传)(client)
package main
import (
"os"
"io"
"strconv"
)
const (
UA = "Golang
Downloader from Kejibo.com"
)
func main() {
f, err :=
os.OpenFile("./file.exe", os.O_RDWR, 0666)
//其实这里的 O_RDWR应该是
O_RDWR|O_CREATE,也就是文件不存在的情况下就建一个空文件,但是因为windows下还有BUG,如果使用这个O_CREATE,就会直接清空文件,所以这里就不用了这个标志,你自己事先建立好文件。
if err !=
nil { panic(err) }
stat, err :=
f.Stat()
//获取文件状态
if err !=
nil { panic(err) }
f.Seek(stat.Size, 0)
//把文件指针指到文件末,当然你说为何不直接用 O_APPEND
模式打开,没错是可以。我这里只是试验。
url :=
"http://dl.google.com/chrome/install/696.57/chrome_installer.exe"
var req
http.Request
req.Method =
"GET"
req.UserAgent = UA
req.Close =
true
req.URL, err
= http.ParseURL(url)
if err !=
nil { panic(err) }
header :=
http.Header{}
header.Set("Range", "bytes=" + strconv.Itoa64(stat.Size) +
"-")
req.Header =
header
resp, err :=
http.DefaultClient.Do(&req)
if err !=
nil { panic(err) }
written, err
:= io.Copy(f, resp.Body)
if err !=
nil { panic(err) }
println("written: ", written)
}
//下载(server)
package main
import (
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"path"
"strconv"
)
var dir string
var port int
var staticHandler http.Handler
// 初始化参数
func init() {
dir =
path.Dir(os.Args[0])
flag.IntVar(&port, "port", 800,
"服务器端口")
flag.Parse()
fmt.Println("dir:", http.Dir(dir))
staticHandler =
http.FileServer(http.Dir(dir))
}
func main() {
http.HandleFunc("/", StaticServer)
err :=
http.ListenAndServe(":"+strconv.Itoa(port), nil)
if err !=
nil {
log.Fatal("ListenAndServe: ", err)
}
}
// 静态文件处理
func StaticServer(w http.ResponseWriter, req *http.Request) {
fmt.Println("path:" + req.URL.Path)
if
req.URL.Path != "/down/" {
staticHandler.ServeHTTP(w, req)
return
}
io.WriteString(w, "hello, world!\n")
}
//上传(client)
package main
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"os"
)
func postFile(filename string, targetUrl string) error {
bodyBuf :=
&bytes.Buffer{}
bodyWriter
:= multipart.NewWriter(bodyBuf)
//关键的一步操作
fileWriter,
err := bodyWriter.CreateFormFile("uploadfile", filename)
if err !=
nil {
fmt.Println("error writing to buffer")
return err
}
//打开文件句柄操作
fh, err :=
os.Open(filename)
if err !=
nil {
fmt.Println("error opening file")
return err
}
//iocopy
_, err =
io.Copy(fileWriter, fh)
if err !=
nil {
return err
}
contentType
:= bodyWriter.FormDataContentType()
bodyWriter.Close()
resp, err :=
http.Post(targetUrl, contentType, bodyBuf)
if err !=
nil {
return err
}
defer
resp.Body.Close()
resp_body,
err := ioutil.ReadAll(resp.Body)
if err !=
nil {
return err
}
fmt.Println(resp.Status)
fmt.Println(string(resp_body))
return
nil
}
// sample usage
func main() {
target_url
:= "http://localhost:9090/upload"
filename :=
"./astaxie.pdf"
postFile(filename, target_url)
}
//上传(server)
package main
import (
"crypto/md5"
"flag"
"fmt"
"html/template"
"io"
"log"
"net/http"
"os"
"path"
"strconv"
"time"
)
var dir string
var port int
// 初始化参数
func init() {
dir =
path.Dir(os.Args[0])
flag.IntVar(&port, "port", 800,
"服务器端口")
flag.Parse()
fmt.Println("dir:", http.Dir(dir))
}
func main() {
http.HandleFunc("/upload", upload)
err :=
http.ListenAndServe(":"+strconv.Itoa(port), nil)
if err !=
nil {
log.Fatal("ListenAndServe: ", err)
}
}
// 处理/upload 逻辑
func upload(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //获取请求的方法
if r.Method
== "GET" {
crutime := time.Now().Unix()
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime,
10))
token := fmt.Sprintf("%x", h.Sum(nil))
t, _ := template.ParseFiles("upload.gtpl")
t.Execute(w, token)
} else
{
r.ParseMultipartForm(32 << 20)
file, handler, err :=
r.FormFile("uploadfile")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
fmt.Fprintf(w, "%v", handler.Header)
f, err :=
os.OpenFile("./upload/"+handler.Filename, os.O_WRONLY|os.O_CREATE,
0666)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
io.Copy(f, file)
}
}
golang文件上传和下载的更多相关文章
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
- JavaWeb学习总结,文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java文件上传和下载
简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- JavaWeb学习总结(五十)——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- 文件上传和下载(可批量上传)——Spring(三)
在文件上传和下载(可批量上传)——Spring(二)的基础上,发现了文件下载时,只有在Chrome浏览器下文件名正常显示,还有发布到服务器后,不能上传到指定的文件夹目录,如上传20160310.txt ...
- 文件上传和下载(可批量上传)——Spring(二)
针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...
- Struts2 之 实现文件上传和下载
Struts2 之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...
随机推荐
- 【转】去掉eclipse的validate
转载地址:http://www.blogjava.net/leisure/archive/2013/01/11/394087.html 困扰了好几天,与大家共享 1,在project名称上右键选择pr ...
- JSTL.带标签体的标签,方法和例子
1. 实现 forEach 标签: 两个属性: items(集合类型, Collection), var(String 类型) doTag: 遍历 items 对应的集合 把正在遍历的对象放入到 pa ...
- shell脚本中的[]/[[]]区别
转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid- ...
- linux主次设备号介绍
1.主设备号与次设备号的功能 在Linux内核中,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务:而次设备号则用来标识具体且唯一的某个设 ...
- 湘潭 A simple problem
A simple problem Accepted : 30 Submit : 303 Time Limit : 15000 MS Memory Limit : 655360 KB Probl ...
- [美]莫提默 J. 艾德勒《如何阅读一本书》
我最近在阅读一本书,这本书的书名叫<如何阅读一本书>(商务出版社,2015),顾名思义. 作者认为,阅读是一件跟写书一样复杂的活动,而许多人并不会阅读. 看过后,你可能会有“我真没 ...
- 土豪聪要请客(stol)
土豪聪要请客(stol) 众所周知,聪哥(ndsf)是个土豪,不过你们不知道的是他的MZ和他的RMB一样滴多…… 某天土豪聪又赚了10^10000e的RMB,他比较开心,于是准备请客.他在自己在XX星 ...
- 关于MYSQL group by 分组按时间取最大值的实现方法!
类如 有一个帖子的回复表,posts( id , tid , subject , message , dateline ) , id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), ...
- context是什么意思
context上下文吗,可以解释为程序运行的某一区间之内,提供对这一区间之内操作的一种对象,而且往往这一区间之内得核心操作都需要这个对象来进行 把Context翻译成“上下文”只是不直观罢了,不过也没 ...
- UIEdgeInsetsMake, CGRectOffset等API参数详解
1, UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right ) 2,position点是相对suerL ...