当前位置: 首页 > 面试题库 >

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

柳玄裳
2023-03-14
问题内容

我想允许上传文件。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..."))

问题答案:

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

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

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

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

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

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



 类似资料:
  • 问题内容: 客户端向从服务器发送文件的大小可能大于5G,而不是从服务器发送到主服务器的大小。 从站将临时文件保存到自己吗?我不希望发生这种情况,因为这会降低上载速度并浪费从站的内存。 有什么办法可以避免这种情况?在golang中传输大文件的最佳方法是什么? 问题答案: 是的,有以避免存储-转发方式的标准方式:只要客户端连接从服务器后应该打开到主服务器的连接,然后就 流 从客户那里的数据。通常,这是

  • 我想上传100MB以上的文件。

  • 本文向大家介绍PHP文件上传问题汇总(文件大小检测、大文件上传处理),包括了PHP文件上传问题汇总(文件大小检测、大文件上传处理)的使用技巧和注意事项,需要的朋友参考一下 由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置。一方面,用户不希望隐私泄露,所以浏览器无法对用户在上传时选择的文件做有效的判 断。另一方面,为了服务器

  • 我想将文件上载到minio文件容器 较小的文件按预期使用此代码: 我需要为要上传的minio服务提供一个。 较小的文件按预期工作(将存储到容器中)。但是较大的文件(在我的测试中为12 MB)不起作用。 我得到了这个例外:

  • 我试图将大文件(4Gb)上传到Azure Blob存储,但失败了。根据本文(https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-blobs),这是我的代码: 但我犯了这个错误 信息:流太长了<来源:系统。私有的CoreLib StackTrace:at系统。伊奥。记忆之流。在Microsoft上写入(字节

  • 是否可以关闭整个文件的eslint规则?某事,如: (类似于eslint-disable-line。)我经常遇到这样的情况,在某个文件中,我在许多地方违反了特定的规则,这对该文件来说是可以的,但我不想为整个项目禁用该规则,也不想为该特定文件禁用其他规则。