如何在Golang中将multipart.File类型转换为* os.File
I am trying to upload video to CloudFlare, but in docs they use os.Open but in my situation user uploads file via html form
Golang CloudFlare Docs: https://developers.cloudflare.com/stream/getting-started/uploading-golang/
file, err := c.FormFile("file")
if err != nil {
log.Errorf("get file error: %s", err)
return c.JSONStatus(http.StatusBadRequest)
}
sourceFile, err := file.Open()
if err != nil {
log.Errorf("open file error: %s", err)
return c.JSONStatus(http.StatusInternalServerError)
}
headers := make(http.Header)
headers.Add("X-Auth-Email", "***")
headers.Add("X-Auth-Key", "***")
config := &tus.Config{
ChunkSize: 5 * 1024 * 1024, // Cloudflare Stream requires a minimum chunk size of 5MB.
Resume: false,
OverridePatchMethod: false,
Store: nil,
Header: headers,
}
client, _ := tus.NewClient("https://api.cloudflare.com/client/v4/accounts/"+ accountID +"/media", config)
upload, _ := tus.NewUploadFromFile(sourceFile)
uploader, _ := client.CreateUpload(upload)
uploader.Upload()
This is actually related to the go-tus
client.
Cloudflare's example creates a tus.Upload
from an *os.File
, but rather than trying to "convert" your multipart.File
to an *os.File
, I would consider the other functions go-tus
provides for getting a tus.Upload
.
Looking at the docs
, you should consider these two:
func NewUpload(reader io.Reader, size int64, metadata Metadata, fingerprint string) *Upload
func NewUploadFromBytes(b []byte) *Upload
Considering multipart.File
implements the io.Reader
interface, you can go with both of these. Which is best depends on your use case, but if the files being uploaded have a size of more than several tens of KB's, you should really NewUpload
. NewUploadFromBytes
forces you to read the entire file into memory first.
In case you need some inspiration for what the size
, metadata
and fingerprint
arguments should contain, look at the implementation of NewUploadFromFile
.