Go пытается решить проблему статических файлов внешнего сервера загрузки.

Go

В последнее время возникает необходимость экспортировать данные в файл заданного формата, браузер скачивает сгенерированный файл, обычно напрямую возвращает адрес статического файла сервера, а фронтенд использует<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 и мной. Если есть какие-либо ошибки, пожалуйста, поправьте меня. Если есть другие лучшие методы, пожалуйста, просветите меня :)