В последнее время возникает необходимость экспортировать данные в файл заданного формата, браузер скачивает сгенерированный файл, обычно напрямую возвращает адрес статического файла сервера, а фронтенд использует<a>
метка через атрибутhref
Вы можете скачать, указав адрес, но некоторые файловые браузеры специального формата будут открываться по умолчанию вместо загрузки, например.xes
(расширение xml) иpng
и другие форматы изображений. Ниже приводится краткое описание некоторых решений.
Из-за большого размера файла поток записи во внешний интерфейс отсутствует.
использовать<a>
помеченdownload
Атрибуты
Атрибут dowanload тега может использоваться только в случае одного и того же источника и в настоящее время поддерживает только Firefox и Google Chrome.
существует<a>
Атрибут href должен быть установлен в теге.
Атрибут загрузки указывает цель гиперссылки для загрузки.
Этому свойству также можно присвоить значение, указывающее имя загруженного файла. Допустимые значения не ограничены, браузер автоматически определит правильное расширение файла и добавит его к файлу (.img, .pdf, .txt, .html и т. д.).
// 请将href中的地址改为文件地址,下载下来的文件名称为 ceshi
<a href="www.baidu.com" download="ceshi">
Метод ctx.SendFile() фреймворка Iris
В фреймворке iris есть метод пакета, метод ctx.SendFile(), который может возвращать содержимое файла во внешний интерфейс. (ps: Если файл очень большой, все равно неудобно иметь много контента)
SendFile(filename string, destinationName string) error
Два параметра, имя файла — путь к целевому файлу, имя назначения — заданное имя файла.
/* 文件目录为
— files
—— first.xml
—— main.go
*/
package main
import (
"github.com/kataras/iris"
)
func main() {
app := iris.New()
app.Get("/", func(ctx iris.Context) {
file := "./files/first.xml"
ctx.SendFile(file, "c.xml")
})
app.Run(iris.Addr(":8080"))
}
Сжать указанный файл
Файлы, которые браузеры не могут загрузить, могут быть сжаты в.zip
файл форматирования, затем.zip
Файл возвращается в браузер, который затем загружает его. Я использовал этот метод
/* 压缩文件为zip格式
* filePath 为需要压缩的文件路径,zipPath为压缩后文件路径
*/
func FileToZip(filePath string,zipPath string) error {
f,err := os.Open(filePath)
if err !=nil{
return err
}
defer f.Close()
z,err := os.Create(zipPath)
if err !=nil{
return err
}
defer z.Close()
wr := zip.NewWriter(z)
// 因为filePath是一个路径,所以会创建路径中的所有文件夹
w,err := wr.Create(filePath)
if err != nil{
return err
}
_,err = io.Copy(w,f)
if err != nil{
return err
}
return nil
}
Вышеупомянутые три метода - это методы, которые были поняты и обобщены Baidu и мной. Если есть какие-либо ошибки, пожалуйста, поправьте меня. Если есть другие лучшие методы, пожалуйста, просветите меня :)