Golang 在下载时停止导航

标签 go web server

每当我使用 Go 从我的网站进行大量下载时,它会阻止我在下载的同时在同一个浏览器中在我的网站上导航或执行任何其他操作。这发生在 Firefox、chrome 和 Safari 上,这让我认为这是一个 conf 问题。

去环境

GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build062753082=/tmp/go-build"

为此使用默认的 GO Web 服务器 net/http。

编辑:

抱歉忘记了下载代码
func FunctionName(res http.ResponseWriter, req *http.Request, p httprouter.Params) {
    defer req.Body.Close()
    setSecurityHeaders(res)
    req.ParseForm()
    id := p.ByName("id")

    incletter, err := GetIncLetterById(bson.ObjectIdHex(id))
    if err != nil {
        jsonResponse(res, map[string]string{"status": "error", "message": "."})
        return
    }

    bytes, filename := incletter.GetFileBytes()

    res.Header().Set("Content-Disposition", "attachment; filename=\""+filename+"\"")
    res.Header().Set("Content-type", "application/pdf")
    res.Header().Set("Content-Length", strconv.Itoa(len(bytes)))
    res.Write(bytes)
}

最佳答案

您的 header 看起来不错(尽管我认为正确的内容类型表示法是正确的大小写(“Content-Type”)。如果这只发生在大文件上,我怀疑这意味着整个文件在被流式传输到客户端。要解决此问题,您可以使用以下命令:

byteSlice, filename := incletter.GetFileBytes()
byteStream := bytes.NewReader(byteSlice)

res.Header().Set("Content-Disposition", "attachment; filename=\""+filename+"\"")
res.Header().Set("Content-type", "application/pdf")
res.Header().Set("Content-Length", strconv.Itoa(len(bytes)))

io.Copy(res, byteStream)

这将实质上从读取器接口(interface)流向写入器,直接流向客户端。

关于Golang 在下载时停止导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62139712/

相关文章:

go - 比较 float64 值和常量

Python Flask Web API [Heroku] : It runs locally but shows Application Error when deployed

php - 寻找比index.html更好的索引

ubuntu - Hadoop-名称节点将无法启动

eclipse - Tomcat 服务器无法使用任何端口号

google-app-engine - GAE Golang - 如何将后端配置为每 X 秒执行一次任务?

global-variables - 程序必须访问包中的全局变量

go - 如何将函数参数静态限制为值的子集

angularjs - 使用 ionic 构建网站的移动网络版本是个好主意吗?

linux - 在 Hetzner 服务器上设置 Lamp