go 上传文件到mongodb中

pj199 2014-08-11 03:11:18
做了一个可以上传文件的网页,现在要求把上传的这个文件存到mongodb里,一点头绪都没有
...全文
406 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
svenwang 2014-08-12
  • 打赏
  • 举报
回复
或者更简单一些。关键是让handler函数有状态。

package main

import (
	"fmt"
	"log"
	"net/http"
)

type DB struct{}

type WebServer struct {
	db *DB
}

func (ws *WebServer) ConnectToDB(source string) error {
	// connecting to db...
	return nil
}

func (ws *WebServer) Upload(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "uploading to db...")
}

func main() {
	ws := WebServer{}
	if err := ws.ConnectToDB("db source"); err != nil {
		log.Fatal(err)
		return
	}
	http.HandleFunc("/upload", ws.Upload)
	http.ListenAndServe(":8080", nil)
}
svenwang 2014-08-12
  • 打赏
  • 举报
回复
引用 3 楼 u012905769 的回复:
[quote=引用 2 楼 svenwang 的回复:] 关于上传文件,以下代码例子是上传文件并计算md5码:

package main

import(
	"net/http"
	"crypto/md5"
	"fmt"
	"io"
	"log"
)

var txt = `
<html>
<head>
</head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
	请选择要计算MD5的文件:<input type="file" name="file" />
	<br>
	<input type="submit" value="upload" />
</form>
</body>
</html>
`

func main() {
	http.HandleFunc("/", serve)
	http.HandleFunc("/upload", upload)
	http.ListenAndServe(":8080", nil)
}

func serve(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(txt))
}

func upload(w http.ResponseWriter, r *http.Request) {
	f, _, err := r.FormFile("file")
	if err != nil {
		log.Printf("error: %s", err)
		return
	}
	defer f.Close()
	h := md5.New()
	if _, err := io.Copy(h, f); err != nil {
		log.Printf("error: %s", err)
		return
	}
	fmt.Fprintf(w, "md5sum: %x", h.Sum(nil))
}
谢谢,我没有说清楚,上传文件已经做好了,是想把上传的文件存到mongodb里面的,后来我是这样做的用GridFS在func uploadHandler(w http.ResponseWriter, r *http.Request)里面添加了这样一段代码
session, err := mgo.Dial("127.0.0.1")
		if err != nil {
			panic(err)
		}
		defer session.Close()
		db := session.DB("filedb")
		file, err := db.GridFS("fs").Create(file-path-name)
然后运行过后可以实现文件存到数据库,只是我这段代码是在upload里面的每次上传文件都会从新执行一次数据库的连接
session, err := mgo.Dial("127.0.0.1")
		if err != nil {
			panic(err)
		}
		defer session.Close()
		db := session.DB("filedb")
这段代码我放到mian()里面的话只执行一次可是在upload里面又找不到db,只能放到upload里面每次上传重复执行?[/quote] 解决这个问题只要把db放到自己的struct里就好了。

package main

import (
	"fmt"
	"log"
	"net/http"
)

type DB struct{}

type WebServer struct {
	server http.Server
	db     *DB
}

func (ws *WebServer) ConnectToDB(source string) error {
	// connecting to db...
	return nil
}

func (ws *WebServer) Upload(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "uploading to db...")
}

func main() {
	ws := WebServer{}
	if err := ws.ConnectToDB("db source"); err != nil {
		log.Fatal(err)
		return
	}
	mux := http.NewServeMux()
	mux.HandleFunc("/upload", ws.Upload)
	ws.server.Handler = mux
	ws.server.Addr = ":8080"
	ws.server.ListenAndServe()
}
pj199 2014-08-12
  • 打赏
  • 举报
回复
引用 2 楼 svenwang 的回复:
关于上传文件,以下代码例子是上传文件并计算md5码:

package main

import(
	"net/http"
	"crypto/md5"
	"fmt"
	"io"
	"log"
)

var txt = `
<html>
<head>
</head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
	请选择要计算MD5的文件:<input type="file" name="file" />
	<br>
	<input type="submit" value="upload" />
</form>
</body>
</html>
`

func main() {
	http.HandleFunc("/", serve)
	http.HandleFunc("/upload", upload)
	http.ListenAndServe(":8080", nil)
}

func serve(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(txt))
}

func upload(w http.ResponseWriter, r *http.Request) {
	f, _, err := r.FormFile("file")
	if err != nil {
		log.Printf("error: %s", err)
		return
	}
	defer f.Close()
	h := md5.New()
	if _, err := io.Copy(h, f); err != nil {
		log.Printf("error: %s", err)
		return
	}
	fmt.Fprintf(w, "md5sum: %x", h.Sum(nil))
}
谢谢,我没有说清楚,上传文件已经做好了,是想把上传的文件存到mongodb里面的,后来我是这样做的用GridFS在func uploadHandler(w http.ResponseWriter, r *http.Request)里面添加了这样一段代码
session, err := mgo.Dial("127.0.0.1")
		if err != nil {
			panic(err)
		}
		defer session.Close()
		db := session.DB("filedb")
		file, err := db.GridFS("fs").Create(file-path-name)
然后运行过后可以实现文件存到数据库,只是我这段代码是在upload里面的每次上传文件都会从新执行一次数据库的连接
session, err := mgo.Dial("127.0.0.1")
		if err != nil {
			panic(err)
		}
		defer session.Close()
		db := session.DB("filedb")
这段代码我放到mian()里面的话只执行一次可是在upload里面又找不到db,只能放到upload里面每次上传重复执行?
svenwang 2014-08-11
  • 打赏
  • 举报
回复
关于上传文件,以下代码例子是上传文件并计算md5码:

package main

import(
	"net/http"
	"crypto/md5"
	"fmt"
	"io"
	"log"
)

var txt = `
<html>
<head>
</head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
	请选择要计算MD5的文件:<input type="file" name="file" />
	<br>
	<input type="submit" value="upload" />
</form>
</body>
</html>
`

func main() {
	http.HandleFunc("/", serve)
	http.HandleFunc("/upload", upload)
	http.ListenAndServe(":8080", nil)
}

func serve(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(txt))
}

func upload(w http.ResponseWriter, r *http.Request) {
	f, _, err := r.FormFile("file")
	if err != nil {
		log.Printf("error: %s", err)
		return
	}
	defer f.Close()
	h := md5.New()
	if _, err := io.Copy(h, f); err != nil {
		log.Printf("error: %s", err)
		return
	}
	fmt.Fprintf(w, "md5sum: %x", h.Sum(nil))
}
svenwang 2014-08-11
  • 打赏
  • 举报
回复
这个事情分两个部分,一个是上传文件,一个是把文件保存到mongodb。 流程是这样的: 客户端==(文件)==>webserver==(文件)==>mongodb 你是对于那部分没有头绪呢?

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧