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

一个 go 文件服务器 ssdb的更多相关文章

  1. 从零开始,在windows上用nodejs搭建一个静态文件服务器

    从零开始,在windows上用nodejs搭建一个静态文件服务器 首先安装nodejs: 新建一个node文件夹 下载node.exe到该文件夹 下载npm然后解压到该文件夹 现在node文件夹是这样 ...

  2. 在Linux系统下搭建和配置一个minio文件服务器(二)

    上一篇主要讲述了在linux系统中搭建一个minio文件服务器,那么这一篇则用来整合java代码中使用,我之前自己已经搭建好了一个springboot项目,那么这一篇将详细讲述如何把minio整合进s ...

  3. Linux c实现一个tcp文件服务器和客户端

    总体需求:编写tcp文件服务器和客户端.客户端可以上传和下载文件. ================================================ 分解需求 客户端功能描述: 1)要 ...

  4. 使用 Azure Blob Stoage 实现一个静态文件服务器

    什么是Azure Blob Stoage Azure Blob Stoage 是微软Azure的对象存储服务.国内的云一般叫OSS,是一种用来存储非结构化数据的服务,比如音频,视频,图片,文本等等.用 ...

  5. 在Linux系统下搭建和配置一个minio文件服务器(一)

    1.minio文件服务器的介绍 Minio 是一个基于Go语言的对象存储服务.它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片.视频.日 ...

  6. httpWebRequest 文件下载

    服务版本: go file system ssdb github: https://github.com/dtxlink/gfs 上一篇: 一个 go 文件服务器 ssdb 通过 httpWebReq ...

  7. 发布一个参考ssdb,使用go类似的实现redis高性能nosql:ledisdb

    起因 ledisdb是一个參考ssdb.採用go实现,底层基于leveldb,相似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持. 我们如今的应用极大的依 ...

  8. redis和ssdb读取性能对比

    最近关注了一下ssdb,它的特点是基于文件存储系统所以它支撑量大的数据而不因为内存的限制受取约束.从官网的测试报告来看其性能也非常出色和redis相当,因此可以使用它来代替redis来进行k-v数据业 ...

  9. Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)

    Nginx 是一个轻量级高性能的 Web 服务器, 并发处理能力强, 消耗资源小, 无论是静态服务器还是网站, Nginx 表现更加出色, 作为 Apache 的补充和替代使用率越来越高,目前很多大型 ...

随机推荐

  1. CentOS7手动编译安装内核4.11.7

    1. 进入/usr/src/目录 cd /usr/src 2. 下载内核源码,网址:https://www.kernel.org wget https://cdn.kernel.org/pub/lin ...

  2. nfs 文件共享 服务

    需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...

  3. openfire在内网的情况下 文件传输代理的设置

    openfire在内网的情况下 文件传输代理的设置 http://blog.csdn.net/v6543210/article/details/22506565

  4. HDU 5136 Yue Fei's Battle

    题目链接:HDU-5136 网上的一篇题解非常好,所以就直接转载了.转自oilover的博客 代码: #include<cstring> #include<cstdio> #i ...

  5. ueditor在QQ浏览器或者IE浏览器中无法加载

    因为IE浏览器有兼容问题,打开网址,浏览器不一定以最新的文档模式加载.按F12查看 在你网址的head标签中加入:<meta http-equiv="x-ua-compatible&q ...

  6. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...

  7. rabbitmq在centos7下安装

    知识预览 一. RabbitMQ队列 二. 事例 三.基于RabbitMQ的RPC 回到顶部 一. RabbitMQ队列 ? 1 2 3 4 5 #消息中间件 -消息队列   - 异步 提交的任务不需 ...

  8. Go语言表组测试示例

    比基本测试多个循环... package main import ( "testing" "net/http" ) const checkMark = &quo ...

  9. 在网站中嵌入VideoJs视频播放器

    一个博客难免需要引用视频来说明内容,但想要自己来实现一个视频播放器是不是一时半会就能完成的,更重要的是这需要对视频播放技术有一定的了解.于是自然而然的有人会想到开源项目.一个不错的选择便是video. ...

  10. AC日记——[POI2014]KUR-Couriers 洛谷 P3567

    [POI2014]KUR-Couriers 思路: 卡空间,sb题: 代码: #include <bits/stdc++.h> using namespace std; #define m ...