Go图片上传
2015-06-24 11:09
656 查看
使用Go语言实现图片上传功能,服务器及客户端的源代码。
服务器端代码:
客户端代码:
服务器端代码:
// uploadfile_server.go package main import ( //"crypto/md5" "fmt" // "html/template" "io" "log" "net/http" "os" // "strconv" //"time" ) //检查目录是否存在 func checkFileIsExist(filename string) bool { var exist = true if _, err := os.Stat(filename); os.IsNotExist(err) { fmt.Print(filename + " not exist") exist = false } return exist } func main() { http.HandleFunc("/upload", upload) err := http.ListenAndServe(":9090", nil) //设置监听的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } log.Println("success!") } // 处理/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 */ fmt.Println(r) if r.Method == "POST" { 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) // bool_fileexist := checkFileIsExist("./test") fmt.Println("check file 1-----------------") fmt.Println("-------------------------bool_fileexist:", bool_fileexist) if bool_fileexist { //如果文件夹存在 //f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件 f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } defer f.Close() io.Copy(f, file) fmt.Println("文件夹存在") } else { //不存在文件夹时 先创建文件夹再上传 err1 := os.Mkdir("./test", os.ModePerm) //创建文件夹 if err1 != nil { fmt.Println(err) return } fmt.Println("文件夹不存在") fmt.Println("文件夹创建成功!") f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } defer f.Close() io.Copy(f, file) } } }
客户端代码:
// uploadfile_client.go package main import ( "bytes" "fmt" "io" "io/ioutil" "mime/multipart" "nettp" "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 } defer fh.Close() //iocopy _, err = io.Copy(fileWriter, fh) if err != nil { return err } contentType := bodyWriter.FormDataContentType() bodyWriter.Close() resp, err := http.Post(targetUrl, contentType, bodyBuf) fmt.Println(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://xxx.xxx.xxx.xxx:9090/upload"//此处为自己的ip地址 filename := "image2.jpg" postFile(filename, target_url) }
相关文章推荐
- Go获取当前执行路径及图片的加解码
- edx---Mongo,could not connect to localhost:27017:
- Google Chrome浏览器调试功能介绍
- HDU 1533 Going Home(最小费用流)
- Django permission
- google play SDK 游戏排行榜的接入分享
- [Leetcode] Basic Calculator
- UVa 11292 The Dragon of Loowater 勇者斗恶龙
- goagent安装和使用
- Django文件上传
- GOF设计模式
- 20150427( Django,filter)
- com.Goods.ForEach
- Go学习1: Hello world
- [django]项目打包构建
- [django]项目打包构建
- uva 11090 Going in Cycle!! (求平均权值最小的环路)
- The last packet sent successfully to the server was 0 milliseconds ago
- goldengate一些参数整理
- 移除整个GoldenGate文件夹之后的恢复