为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 文件上传:如果文件太大则关闭连接

Golang 文件上传:如果文件太大则关闭连接

Go
泛舟湖上清波郎朗 2021-08-23 16:33:28
我想允许上传文件。Go 被用于服务器端处理请求。每当他们尝试上传的文件太大时,我想发送响应“文件太大”。我想在上传整个文件(带宽)之前这样做。我正在使用以下代码段,但它仅在客户端完成上传后发送响应。它保存了一个 5 kB 的文件。const MaxFileSize = 5 * 1024// This feels like a bad hack...if r.ContentLength > MaxFileSize {    if flusher, ok := w.(http.Flusher); ok {        response := []byte("Request too large")        w.Header().Set("Connection", "close")        w.Header().Set("Content-Length", fmt.Sprintf("%d", len(response)))        w.WriteHeader(http.StatusExpectationFailed)        w.Write(response)        flusher.Flush()    }    conn, _, _ :=  w.(http.Hijacker).Hijack()    conn.Close()    return}r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize)err := r.ParseMultipartForm(1024)if err != nil {    w.Write([]byte("File too large"));    return}file, header, err := r.FormFile("file")if err != nil {    panic(err)}dst, err := os.Create("upload/" + header.Filename)defer dst.Close()if err != nil {     panic(err)}written, err := io.Copy(dst, io.LimitReader(file, MaxFileSize))if err != nil {    panic(err)}if written == MaxFileSize {    w.Write([]byte("File too large"))    return}w.Write([]byte("Success..."))
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

大多数客户端在完成写入请求之前不会读取响应。响应来自服务器的错误不会导致这些客户端停止写入。


net/http 服务器支持100 continue 状态。要使用此功能,服务器应用程序应在读取请求正文之前响应错误:


func handler(w http.ResponseWriter, r *http.Request) {

  if r.ContentLength > MaxFileSize {

     http.Error(w, "request too large", http.StatusExpectationFailed)

     return

  }

  r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize)

  err := r.ParseMultipartForm(1024)


  // ... continue as before

如果客户端发送了“Expect: 100-continue”标头,则客户端应该在写入请求正文之前等待 100 continue 状态。当服务器应用程序读取请求正文时,net/http 服务器会自动发送 100 continue 状态。服务器可以通过在读取请求之前回复错误来阻止客户端写入请求正文。


net/http 客户端不支持 100 continue 状态。


如果客户端没有发送 expect 标头并且服务器应用程序从请求处理程序返回而不读取完整的请求正文,则 net/http 服务器读取并丢弃最多 256 << 10 个字节的请求正文。如果未读取整个请求正文,服务器将关闭连接。


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信