Как преобразовать тип multipart.File в *os.File в Golang

Я пытаюсь загрузить видео в 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()
f не определен в вашем цитируемом коде, а sourceFile не используется. Маловероятно, что NewUploadFromFile действительно требует os.File; любой io.Reader, вероятно, подойдет (проверьте документацию по NewUploadFromFile в документах CloudFlare SDK). Просто передайте file, от которого вы вернулись из formFile.
Adrian 08.07.2019 16:19

Да, есть несколько переменных, которые не определены (я вырезал часть кода и забыл изменить его здесь). Но если я передаю файл, он не работает

Klimbo 08.07.2019 16:23
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
2
2 992
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле это связано с 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.

Другие вопросы по теме