How to convert *multipart.FileHeader file type to *os.File in golang
我想将多部分文件直接流式传输到AWSS3,而不是首先将文件保存到磁盘。在我的golang REST API中接收* multipart.FileHeader类型的文件。现在,我想使用s3manager上传方法将其流式传输到AWSS3,其中需要在主体参数中传递* bytes.Reader。我已经看到了一个将文件上传到AWSS3的示例,该示例的编写方式是从磁盘打开* os.File类型的文件os.Open(" filepath"),从其中获取* bytes.Reader并传递给AWSS3。现在我正在努力将此* multipart.FileHeader转换为* os.File。
- 更新。做了一些实验。现在我需要将multipart.File转换为os.File
-
您要*os.File还是真正的io.Reader?该文件仅适用于物理上位于磁盘上的文件,但是您还说您不希望该文件位于磁盘上?
-
是的,我想要io.Reader
在multipart.FileHeader上调用Open。它将返回一个multipart.File,它将为文件提供阅读器(将保存在内存中)。
- 添加更多的ParseMultipartForm将使您可以控制何时在内存中存储文件以及何时将文件写入temp。从文档中:其文件部分的总计maxMemory字节存储在内存中,其余部分存储在磁盘上的临时文件中。
-
如何避免写入disk(temp)并再次取走它?
-
@RaviTejaBathula如果确实需要* os.File,则需要在某个位置写入文件。但是,没有理由真正需要* os.File。
-
@RaviTejaBathula如果要完全阻止文件访问磁盘,则有两个选择。 (1)将maxMemory设置为足够大的值,以使其可以将文件保存在内存中(您可以使用http包的其他部分来限制传入请求的大小)。 (2)使用*http.Request.MultiPartReader直接访问部件。
-
@djd我成功了。我将传入的文件数据转换为字节,并传递给bytes.NewReader(),这给了我io.Reader。感谢您的时间。现在,我将根据您的想法优化代码。
-
@RTBathula我有同样的问题。您能否提供将文件转换为字节然后传递给bytes.NewReader()的确切代码?
您可以使用os.Open()将multipart.FileHeader转换为*(os.File)
示例
1 2
| _, header , _ := c.Request.FormFile("upload")
out, _ := os.Open(header.Filename) |