Я пытаюсь загрузить видео в 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
, вы можете использовать оба из них. Что лучше, зависит от вашего варианта использования, но если загружаемые файлы имеют размер более нескольких десятков КБ, вам действительно следует NewUpload
. NewUploadFromBytes
заставляет вас сначала прочитать весь файл в память.
Если вам нужно вдохновение для того, что должны содержать аргументы size
, metadata
и fingerprint
, посмотрите на реализация NewUploadFromFile
.
f
не определен в вашем цитируемом коде, аsourceFile
не используется. Маловероятно, чтоNewUploadFromFile
действительно требуетos.File
; любойio.Reader
, вероятно, подойдет (проверьте документацию поNewUploadFromFile
в документах CloudFlare SDK). Просто передайтеfile
, от которого вы вернулись изformFile
.