2,190
社区成员
发帖
与我相关
我的任务
分享
package main
import (
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"io"
"os"
)
func check(err error) {
if err != nil {
return
}
}
func main() {
f, err := os.Open("D:/test.txt")
check(err)
defer f.Close()
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("test.txt")
io.Copy(file, f)
err = file.Close()
check(err)
file1, err := db.GridFS("fs").Open("test.txt")
io.Copy(os.Stdout, file1)
err = file1.Close()
fmt.Println(file1.Id())
fmt.Println(file1.UploadDate())
fmt.Println(file1.Size())
}
我的代码求指点
dst, err = db.GridFS("fs").Create("test.txt")
[/quote]
dst, err = db.GridFS("fs").Open("test.txt")过后好像不可以_, err = io.Copy(dst, src),显示panic: GridFile is open for reading,我看文档里也只是read操作,file, err := db.GridFS("fs").Open("myfile.txt")
check(err)
b := make([]byte, 8192)
n, err := file.Read(b)
check(err)
fmt.Println(string(b))
check(err)
err = file.Close()
check(err)
fmt.Printf("%d bytes read\n", n)
没有说可以覆盖掉原文件的操作,我想是不是如果打开的时候存在就删除重新建个最新的[/quote]
确实是Open的文件是只读的,不能再io.Copy。感觉这里API设计的有些问题,既然是只读的,为什么还有提供Write函数呢。
如果存在就删除再新建文件的思路应该是可行的。
[/quote]
看文档的时候每次看到gridfs里面的setname函数就感觉是个鸡肋,突然想起来昨天写的删除文件建立新文件这样不安全,如果建立新文件失败了,原文件已经被删了,应该先建立文件然后再删除,先建立的文件肯定不能同名,所以删除后再把这个文件改名
package main
import (
"fmt"
"gopkg.in/mgo.v2"
"io"
"os"
//"gopkg.in/mgo.v2/bson"
)
func check(err error) {
if err != nil {
panic(err)
}
}
func main() {
src, err := os.Open("D:/mongodb/data/db/test.txt")
if err != nil {
fmt.Printf("打开本地文件错误\n")
}
defer src.Close()
session, err := mgo.Dial("127.0.0.1")
if err != nil {
fmt.Printf("链接数据库错误\n")
}
defer session.Close()
db := session.DB("filedb")
dst, err := db.GridFS("fs").Open("test.txt")
if err != nil {
fmt.Printf("要打开的文件不存在\n")
if err != mgo.ErrNotFound {
fmt.Printf("mgo错误\n")
}
// create the file when failing to open it
dst, err = db.GridFS("fs").Create("test.txt")
_, err = io.Copy(dst, src)
if err != nil {
fmt.Printf("创建文件错误\n")
}
//defer dst.Close()
} else {
fmt.Printf("要打开的文件存在,重新建立,删除原有的文件\n")
dst, err = db.GridFS("fs").Create("test.txt.dat")
fmt.Printf("创立新文件test.txt.dat\n")
_, err = io.Copy(dst, src)
if err != nil {
fmt.Printf("创建文件错误\n")
}
err = db.GridFS("fs").Remove("test.txt")
if err != nil {
fmt.Printf("删除文件错误\n")
}
dst.SetName("test.txt")
fmt.Printf("创建新文件test.txt\n")
}
defer dst.Close()
}
}
dst, err = db.GridFS("fs").Create("test.txt")
[/quote]
dst, err = db.GridFS("fs").Open("test.txt")过后好像不可以_, err = io.Copy(dst, src),显示panic: GridFile is open for reading,我看文档里也只是read操作,file, err := db.GridFS("fs").Open("myfile.txt")
check(err)
b := make([]byte, 8192)
n, err := file.Read(b)
check(err)
fmt.Println(string(b))
check(err)
err = file.Close()
check(err)
fmt.Printf("%d bytes read\n", n)
没有说可以覆盖掉原文件的操作,我想是不是如果打开的时候存在就删除重新建个最新的[/quote]
确实是Open的文件是只读的,不能再io.Copy。感觉这里API设计的有些问题,既然是只读的,为什么还有提供Write函数呢。
如果存在就删除再新建文件的思路应该是可行的。
[/quote]
唉,write函数writes the provided data to the file在GridFiles好鸡肋啊,先按照删除在新建吧,还有一个星期交工,要整合的太多了,时间太紧了
dst, err = db.GridFS("fs").Create("test.txt")
[/quote]
dst, err = db.GridFS("fs").Open("test.txt")过后好像不可以_, err = io.Copy(dst, src),显示panic: GridFile is open for reading,我看文档里也只是read操作,file, err := db.GridFS("fs").Open("myfile.txt")
check(err)
b := make([]byte, 8192)
n, err := file.Read(b)
check(err)
fmt.Println(string(b))
check(err)
err = file.Close()
check(err)
fmt.Printf("%d bytes read\n", n)
没有说可以覆盖掉原文件的操作,我想是不是如果打开的时候存在就删除重新建个最新的[/quote]
确实是Open的文件是只读的,不能再io.Copy。感觉这里API设计的有些问题,既然是只读的,为什么还有提供Write函数呢。
如果存在就删除再新建文件的思路应该是可行的。
dst, err = db.GridFS("fs").Create("test.txt")
[/quote]
dst, err = db.GridFS("fs").Open("test.txt")过后好像不可以_, err = io.Copy(dst, src),显示panic: GridFile is open for reading,我看文档里也只是read操作,file, err := db.GridFS("fs").Open("myfile.txt")
check(err)
b := make([]byte, 8192)
n, err := file.Read(b)
check(err)
fmt.Println(string(b))
check(err)
err = file.Close()
check(err)
fmt.Printf("%d bytes read\n", n)
没有说可以覆盖掉原文件的操作,我想是不是如果打开的时候存在就删除重新建个最新的
dst, err = db.GridFS("fs").Create("test.txt")
[/quote]
谢谢了,我这个本地的文件实际运行的时候是没有的,远程客户端上传文件到mongodb,然后我从mongodb里面取文件,所以才不用的io.Copy,我没说清楚,这个是我单拿出来测试下的
dst, err = db.GridFS("fs").Create("test.txt")
// Open returns the most recently uploaded file with the provided
// name, for reading. If the file isn't found, err will be set
// to mgo.ErrNotFound.
可以先Open,如果失败并且错误是NotFound,然后再去Create:
package main
import (
"fmt"
"io"
"os"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
func check(err error) {
if err != nil {
panic(err)
}
}
func main() {
src, err := os.Open("D:/test.txt")
check(err)
defer src.Close()
session, err := mgo.Dial("127.0.0.1")
check(err)
defer session.Close()
db := session.DB("filedb")
dst, err = db.GridFS("fs").Open("test.txt")
if err != nil {
if err != mgo.ErrNotFound {
panic(err)
}
// create the file when failing to open it
dst, err := db.GridFS("fs").Create("test.txt")
check(err)
}
defer dst.Close()
_, err = io.Copy(dst, src)
check(err)
fmt.Println(dst.Id())
fmt.Println(dst.UploadDate())
fmt.Println(dst.Size())
}
// Create creates a new file with the provided name in the GridFS. If the file
// name already exists, a new version will be inserted with an up-to-date
// uploadDate that will cause it to be atomically visible to the Open and
// OpenId methods.
package main
import (
"fmt"
"io"
"os"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
func check(err error) {
if err != nil {
panic(err)
}
}
func main() {
src, err := os.Open("D:/test.txt")
check(err)
defer src.Close()
session, err := mgo.Dial("127.0.0.1")
check(err)
defer session.Close()
db := session.DB("filedb")
dst, err = db.GridFS("fs").Open("test.txt")
if err != nil {
// create the file when failing to open it
dst, err := db.GridFS("fs").Create("test.txt")
check(err)
}
_, err = io.Copy(dst, src)
check(err)
defer dst.Close()
fmt.Println(dst.Id())
fmt.Println(dst.UploadDate())
fmt.Println(dst.Size())
}