设为首页 加入收藏

TOP

一个 go 文件服务器 ssdb
2017-12-07 14:23:04 】 浏览:20
Tags:一个 文件 服务器 ssdb

file system ssdb

 

go http listen

文件存储到 ssdb

 

gfs 

|

twemproxy

|

ssdb(master) ssdb(slave)

 

ssdb 连接协议为 redis 协议

生成MD5 KEY

 handle.go 代码

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"path"
)

func (ctx *Context) server(w http.ResponseWriter, r *http.Request) {
	//params := r.URL.Query()
	//key := params.Get("k")
	//callback := params.Get("cb")
	path := r.URL.Path

	if path == "/" {
		home(w, r)
	} else {
		md5key := path[1:len(path)]
		fmt.Println("md5key:" + md5key)

		ctx.store.Get("key")

		val, err := ctx.store.Get(md5key)
		if err != nil {
			fmt.Fprint(w, "the file not exits!")
		}

		fmt.Fprint(w, val)
		ctx.download(w, r, md5key)
	}
}

func home(w http.ResponseWriter, r *http.Request) {
	if r.Method != "GET" {
		http.Error(w, "Method Not Allowed", 405)
		return
	}

	html := `<!DOCTYPE html>
	<html>
	    <head>
	        <meta charset="UTF-8"/>
	    </head>
	    <body>
	        <form action="/upload" method="POST" enctype="multipart/form-data">
	            <label for="field1">file:</label>
	            <input name="file" type="file" />
	            <input type="submit"></input>
	        </form>
	    </body>
	</html>`

	fmt.Fprint(w, html)
}

func (ctx *Context) upload(w http.ResponseWriter, r *http.Request) {
	//	if err := r.ParseMultipartForm(CACHE_MAX_SIZE); err != nil {
	//		//ctx.context.Logger.Error(err.Error())
	//		//ctx.doError(err, http.StatusForbidden)
	//		return
	//	}

	file, handle, err := r.FormFile("file")
	if err != nil {
		//ctx.doError(err, 500)
		fmt.Println(err)
		return
	}
	defer file.Close()

	//fmt.Println("upload file:%s", handle.Filename)
	//fmt.Println("ext" + path.Ext(handle.Filename))
	ext := path.Ext(handle.Filename)

	data, err := ioutil.ReadAll(file)
	if err != nil {
		//ctx.doError(err, 500)
		fmt.Println(err)
		return
	}

	md5key := fmt.Sprintf("%s%s", gen_md5_str(data), ext)

	ctx.store.Set(md5key, data)
	if err != nil {
		//fmt.Println("upload file fail:" md5key)
		fmt.Println(err)
		return
	}
	w.Write([]byte(fmt.Sprintf("%s", md5key)))
}

func (ctx *Context) download(w http.ResponseWriter, r *http.Request, key string) {
	val, err := ctx.store.Get(key)
	if err != nil {
		fmt.Fprint(w, "the file not exits!")
	}
	fmt.Fprint(w, val)
}

  

 

代码托管到 github

https://github.com/dtxlink/gfs

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇golang关于一些新手不注意会出现.. 下一篇golang-小试牛刀

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目