golang-文件调用完io.Copy()方法之后再次读取文件为空

错误示例

在MD5文件内容时会用使用到io.Copy()方法,具体代码实例如下:

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

func main(){
    file,_ := os.Open("D:/test.txt")
    defer file.Close()
    bytesInfo , _ := ioutil.ReadAll(file)
    fmt.Println("文本内容:",string(bytesInfo))

    //求文件MD5值
    h := md5.New()
    io.Copy(h,file)
    sum := h.Sum(nil)
    currentMD5 := hex.EncodeToString(sum)
    fmt.Println("当前文件的Md5为:",currentMD5)

    bytes2 , _ := ioutil.ReadAll(file)
    fmt.Println("文本内容:",string(bytes2))

}

运行之后打印结果如下:

文本内容: asdadasd
当前文件的Md5为: d41d8cd98f00b204e9800998ecf8427e
文本内容:                                        

可以看到:在第二次打印文件内容时,文件内容为空了,这就会导致在UploadFile文件上传函数被调用时,内容获取为空

原因

造成这种现象的原因主要是:我们在第二次打印文件内容之前对文件做了一次求hash值运算,其中调用了io.Copy()方法 ,io.Copy()方法会读取文件内容,并移动文件指针。在调用完io.Copy()方法之后,文件指针是被移到文件的末尾处了,所以在第二次读取文件文件的内容为空。

解决方法

在第二次使用文件之前调用file.seek(0,0)方法,该方法会将文件指针移到开头。

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

func main(){
    file,_ := os.Open("D:/test.txt")
    defer file.Close()
    bytesInfo , _ := ioutil.ReadAll(file)
    fmt.Println("文本内容:",string(bytesInfo))

    //求文件MD5值
    h := md5.New()
    io.Copy(h,file)
    sum := h.Sum(nil)
    currentMD5 := hex.EncodeToString(sum)
    fmt.Println("当前文件的Md5为:",currentMD5)

    file.Seek(0,0) //将文件指针移到文件开头

    bytes2 , _ := ioutil.ReadAll(file)
    fmt.Println("文本内容:",string(bytes2))

}

再次运行可以看到打印结果如下:

文本内容: asdadasd
当前文件的Md5为: d41d8cd98f00b204e9800998ecf8427e
文本内容: asdadasd                               

有关file.Seek()方法的参数具体含义如下:

func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek函数将下一次在文件上读取或写入的偏移量(文件指针)设置为指定偏移量(相对于whence做offset个偏移)。

参数whence的进一步解释:0表示相对于文件原点,1表示相对于当前偏移量,2表示相对于末尾。

返回结果为新的偏移量和错误(如果有)。

file.Seek(0,0)的含义就是相对于文件原点偏移0个量,即文件的开头。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇