Go 创建文件和ioutil.ReadFile之间的竞争条件

Go 创建文件和ioutil.ReadFile之间的竞争条件,go,file-upload,Go,File Upload,我有一个允许上传图像的golang web应用程序端点,但我发现创建一个文件并立即使用ioutil.ReadFile读取它将导致数据为空。但如果我稍后再调用它,它将包含数据 r.ParseMultipartForm(32 << 20) file, handler, err := r.FormFile("my_input_name") f, err := os.OpenFile("./img_dump/"+handler.Filename, os.O_WRON

我有一个允许上传图像的golang web应用程序端点,但我发现创建一个文件并立即使用
ioutil.ReadFile
读取它将导致
数据
为空。但如果我稍后再调用它,它将包含数据

    r.ParseMultipartForm(32 << 20)
    file, handler, err := r.FormFile("my_input_name")

    f, err := os.OpenFile("./img_dump/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
       return
    }
    // data is empty [] when first called
    data, err := ioutil.ReadFile("/myAbsolutePath/img_dump/"  + handler.Filename)
    // This does not work, data is empty
    fmt.Println(len(data))

    f.Sync()

    data, err = ioutil.ReadFile("/myAbsolutePath/img_dump/"  + handler.Filename)

    // This does not work, data is empty
    fmt.Println(len(data))

    c1 := make(chan string, 1)
    go func() {
        time.Sleep(time.Second * 5)
        c1 <- "result 1"
    }()

    go func(name string) {
        select {
        case _ = <-c1:
            data, err = ioutil.ReadFile("/myAbsolutePath/img_dump/" + name)
            fmt.Println("after sleep")
            // This only works if I don't try f.Close(), data is not empty
            fmt.Println(len(data))
        }
    }(handler.Filename)
r.ParseMultipartForm(32你试过使用吗

同步将文件的当前内容提交到稳定存储。 通常,这意味着刷新文件系统的内存中副本 最近写入磁盘的数据


嗯,我试过了,好像是同一个问题persist@user3591466在使用ioutil.ReadFile之前需要调用f.Sync,您也可以尝试在访问文件之前使用f.Close关闭文件。在此代码段中,您从未实际写入到
f
。。。
f, err := os.OpenFile("./img_dump/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {...}

err = f.Sync()
if err != nil {...}

err = f.Close()
if err != nil {...}

data, err := ioutil.ReadFile("/myAbsolutePath/img_dump/"  + handler.Filename)