gpt4 book ai didi

go - 最近复制的文件以字节数组形式返回全0

转载 作者:行者123 更新时间:2023-12-01 22:43:20 24 4
gpt4 key购买 nike

我有一个go文件服务器,可以接收10GB以上文件的请求。为了保持较低的内存使用率,我将多部分表单数据读取到一个tmp文件中。我知道FormFile在后台执行相同的操作,但是我仍然需要将其传输到常规文件中,以进行一些后期上传处理。

    f, header, err := r.FormFile("file")
if err != nil {
return nil, fmt.Errorf("could not get file from request %w", err)
}

tmpFile, err := ioutil.TempFile("", "oriio-")
if err != nil {
return nil, err
}

if _, err := io.Copy(tmpFile, f); err != nil {
return nil, fmt.Errorf("could not copy request body to file %w", err)
}

此后,我需要获取文件的前261个字节以确定其MIME类型。

head := make([]byte, 261)

if _, err := tmpFile.Read(head); err != nil {
return nil, err
}

我遇到的问题是,如果我尝试直接从tmpFile读取,则在我打印 fmt.Prinf("%x", head) aka无效数据时,字节数组返回261 0。为了验证数据是否有效,我将其保存到常规文件中,并在系统中将其打开,并且文件(在本例中为图像文件)完好无损。因此,这不是损坏的文件问题。为了解决该问题,我现在关闭tmp文件,然后再次将其重新打开,这似乎可以解决所有问题。

    tmpFile, err := ioutil.TempFile("", "oriio-")
if err != nil {
return nil, err
}

if _, err := io.Copy(tmpFile, f); err != nil {
return nil, fmt.Errorf("could not copy request body to file %w", err)
}

tmpFile.Close()

tmpFile, err = os.Open(tmpFile.Name())
if err != nil {
panic(err)
}

head := make([]byte, 261)

if _, err := tmpFile.Read(head); err != nil {
return nil, err
}

现在,当我打印出头字节数组时,将打印正确的内容。为什么是这样?我必须使用原始的tmp文件进行某种同步或冲洗吗?

最佳答案

读取/写入文件会更改文件中的当前位置。复制后,tmpFile位于末尾,因此从其读取将读取0个字节。如果要从文件开头读取,则必须先查找:

io.Copy(tmpFile, f)
tmpFile.Seek(0,0)
tmpFile.Read(head)

关于go - 最近复制的文件以字节数组形式返回全0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60978011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com