首页 > 解决方案 > 如何在 Golang 中将类型 multipart.File 转换为 *os.File

问题描述

我正在尝试将视频上传到 CloudFlare,但在文档中他们使用 os.Open 但在我的情况下,用户通过 html 表单上传文件

Golang CloudFlare 文档: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()

标签: gocloudflare

解决方案


这其实和go-tus客户端有关。

Cloudflare的示例tus.Upload从. *os.File_ _multipart.File*os.Filego-tustus.Upload

查看docs,您应该考虑以下两个:

  • func NewUpload(reader io.Reader, size int64, metadata Metadata, fingerprint string) *Upload
  • func NewUploadFromBytes(b []byte) *Upload

考虑multipart.File实现io.Reader接口,您可以同时使用这两种方法。哪个最好取决于您的用例,但如果上传的文件大小超过几十 KB,您真的应该NewUpload. NewUploadFromBytes强制您首先将整个文件读入内存。

如果您需要一些灵感来了解size和参数应该包含的内容metadatafingerprint请查看.NewUploadFromFile


推荐阅读