Размер файла `io.Copy` отличается от исходного - PullRequest
0 голосов
/ 21 февраля 2020

Я имею дело с загрузкой файла multipart / form-data, и мой бэкэнд использует Go io.Copy для копирования данных формы в локальный файл.

func SaveFileHandler() error {
    ...

    file := form.File["file_uploaded"] // file uploaded in form
    src, _ := file.Open()

    // here the original file size is 35540353 in my case, 
    // which is a video/mp4 file
    fmt.Println(file.Size) 

    // create a local file with same filename
    dst, _ := os.Create(file.Filename)

    // save it
    _, err = io.Copy(dst, src)

    // err is nil
    fmt.Println(err) 

    stat, _ := dst.Stat()
    // then the local file size differs from the original updated one. Why?
    // local file size becomes 35537281 (original one is 35540353)
    fmt.Println(stat.Size()) 
    // meanwhile I can't open the local video/mp4 file, 
    // which seems to be broken due to losing data from `io.Copy`

    ...

Как это может быть? Есть ли максимальный размер буфера для io.Copy? Или имеет значение тип MIME файла в этом случае?
Я попытался с png и txt файлом, и оба работали как ожидалось.

Go версия go1.12.6 linux/amd64

1 Ответ

0 голосов
/ 22 февраля 2020

В вашем вопросе не так уж много информации, но из того, что вы сказали, я уверен, что данные не полностью сбрасываются в файл перед тем, как вы позвоните dst.Stat(). Вы можете сначала закрыть файл, чтобы убедиться, что данные полностью сброшены:

func SaveFileHandler() error {
    ...

    // create a local file with same filename
    dst, _ := os.Create(file.Filename)

    // save it
    _, err = io.Copy(dst, src)

    // Close the file
    dst.Close()

    // err is nil
    fmt.Println(err) 

    stat, _ := dst.Stat()    
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...