如何在golang中将*multipart.FileHeader文件类型转换为*os.file

如何在golang中将*multipart.FileHeader文件类型转换为*os.file,go,amazon-s3,Go,Amazon S3,我想将多部分文件直接流式传输到AWSS3,而不是首先将文件保存到磁盘。在my golang REST API中接收类型为*multipart.FileHeader的文件。现在我想使用upload方法将其流式传输到AWSS3,其中需要在body参数中传递*bytes.Reader。我见过一个例子,它是这样写的:从磁盘打开一个*os.file类型的文件os.Open(“filepath”),从中取出*bytes.Reader并传递给AWSS3。现在我正在努力将这个*multipart.FileHea

我想将多部分文件直接流式传输到AWSS3,而不是首先将文件保存到磁盘。在my golang REST API中接收类型为*multipart.FileHeader的文件。现在我想使用upload方法将其流式传输到AWSS3,其中需要在body参数中传递*bytes.Reader。我见过一个例子,它是这样写的:从磁盘打开一个*os.file类型的文件os.Open(“filepath”),从中取出*bytes.Reader并传递给AWSS3。现在我正在努力将这个*multipart.FileHeader转换为*os.File。

调用
multipart.FileHeader
。它将返回一个
multipart.File
,该文件将提供文件的读取器(将保存在内存中)。

您可以使用os.Open()将multipart.FileHeader转换为*(os.File)

范例

_, header , _ := c.Request.FormFile("upload")
out, _ := os.Open(header.Filename)

添加更多的
ParseMultipartForm
将允许您控制何时将文件放入内存,以及何时将文件写入临时文件。从文档中可以看出:其文件部分的maxMemory字节总数存储在内存中,其余部分存储在磁盘上的临时文件中。如何避免写入磁盘(temp)并再次从中取出?@RaviTejaBathula如果您确实需要一个*os.file,您需要在某处写入一个文件。但是,应该没有理由真的需要一个*os.File。@RaviTejaBathula如果你想阻止文件撞击磁盘,你有两个选择。(1) 将
maxMemory
设置为足够大的值,使其能够在内存中保存文件(您可以使用
http
包的其他部分来限制传入请求的大小)。(2) 使用
*http.Request.MultiPartReader
直接访问部件的文件。@djd I成功。我将传入的文件数据转换为字节,并传递给bytes.NewReader(),它为我提供了io.Reader。谢谢你抽出时间。我现在就用你的想法优化代码。更新。做了一些实验。现在我需要将multipart.File转换为os.File您想要
*os.File
还是真正的
io.Reader
?该文件仅适用于物理上位于磁盘上的文件,但您也在说您不希望该文件位于磁盘上?是的,我想要io.Reader