go - 如何在 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()
解决方案
这其实和go-tus
客户端有关。
Cloudflare的示例tus.Upload
从. *os.File
_ _multipart.File
*os.File
go-tus
tus.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
和参数应该包含的内容metadata
,fingerprint
请查看.NewUploadFromFile
推荐阅读
- c++ - Unknown Runtime When Using c++11 instead if c++14
- datetime - 如何在批处理文件中按日期时间创建文件夹
- jquery - this jquery validation prevent me to post form data, without this all is working fine
- python - 在 python 上使用 selenium 抓取动态网站
- c++ - const char* 常量数组
- maven - 无法将 Google Cloud Datastore 与 AEM 6.5 连接:Bundle 已解决依赖项
- typescript - 打字稿函数输出不能分配给条件类型
- php - laravel 8 模块表单错误此路由不支持 POST 方法。支持的方法:GET、HEAD
- c++ - 使用三元运算符从 cin 或文件中选择 istream
- r - 有没有办法运行多个 t.tests 产生的结果可以很容易地以表格格式存储?