#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.функция сброса ) в том месте, где я хотел сохранить свой файл. После сохранения файла я вызвал свою функцию отправителя, и она сработала.