Обслуживание загружаемых файлов HTTP

#http #go #http-headers

#http #Вперед #http-заголовки

Вопрос:

Я хочу обслуживать загружаемый файл, но когда я его протестировал, я смог загрузить файл, но загруженный файл пуст. Я проверил в IDE, что в файле есть содержимое, но загруженный файл пуст, и даже я получаю размер файла как 0. Пожалуйста, помогите.

Информация о файле: — файл представляет собой csv и содержит только одну строку с именем поля.

  func SendFileToClient(w http.ResponseWriter,r *http.Request,file string){

    downloadBytes, err := ioutil.ReadFile(file)
    fmt.Println("file to be sent ",file)
    if err != nil {
        fmt.Printf("unable to download the file: %v", err)
    }

    mime := http.DetectContentType(downloadBytes)
    fileSize := len(string(downloadBytes))
   fmt.Println("mime is ",mime ," filesize ",fileSize)
    //Generate the server headers
    w.Header().Set("Content-Type", "octet-stream")
    w.Header().Set("Content-Disposition", "attachment; filename=" file "")
    w.Header().Set("Expires", "0")
    w.Header().Set("Content-Transfer-Encoding", "binary")
    w.Header().Set("Content-Length", strconv.Itoa(fileSize))
    w.Header().Set("Content-Control", "private, no-transform, no-store, must-revalidate")


    
    //// force it down the client's.....
    http.ServeContent(w, r, file, time.Now(), bytes.NewReader(downloadBytes))



}

  

Комментарии:

1. Вы уверены, что ioutil.ReadFile не возвращает ошибку? Вы просто двигаетесь дальше, как будто ничего не произошло после того, как напечатаете ошибку.

2. Нет, это не возвращает никакой ошибки, но функция ioutil.ReadFile считывает 0 байт, даже путь правильный.

Ответ №1:

Хорошо, я понял, что использую «отложить запись.flush()» для создания файла CSV и в той же функции, которую я вызывал выше функции sender, из-за отложенного файла не был сохранен, и он отправлял пустой файл, а после отправки пустого файла сохранялся файл. Поэтому я удалил defer и поместил (writer.функция сброса ) в том месте, где я хотел сохранить свой файл. После сохранения файла я вызвал свою функцию отправителя, и она сработала.