ทำไมกำลังอัพโหลดแฟ้ม~2,5 เมกะไบต์หรือใหญ่เพราะเป็นการเชื่อมต่อใหม?

0

คำถาม

เรากำลังพยายามจะดำเนิกำลังอัพโหลดภาพผ่านโพสต์สิ่งที่ร้องขอมา เรายังต้องการเพื่อจำกัดภาพที่จะ~1,0 เมกะไบต์. มันทำงานได้ดีขึ้นเล็กลงภาพแต่อะไร~2,5 เมกะไบต์หรือใหญ่เป็นโตยอมรับเถอะแอนการเชื่อมต่อสำหรับปรับค่า. มันดูเหมือนจะส่งหลายขอร้องให้หลังจากคนแรกที่เดียวกับเครื่องมือจัดการ.

หลัก.ไป:

package main

import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", uploadHandler)
    http.ListenAndServe("localhost:8080", nil)
}

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        postHandler(w, r)
        return
    } else {
        http.ServeFile(w, r, "index.html")
    }
}

func postHandler(w http.ResponseWriter, r *http.Request) {
    // Send an error if the request is larger than 1 MiB
    if r.ContentLength > 1<<20 {
        // if larger than ~2,5 MiB, this will print 2 or more times
        log.Println("File too large")
        // And this error will never arrive, instead a Connection reset
        http.Error(w, "response too large", http.StatusRequestEntityTooLarge)
        return
    }
    return
}

index.html:

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form method="POST" enctype="multipart/form-data">
      <input type="file" accept="image/*" name="profile-picture"><br>
      <button type="submit" >Upload</button>
  </form>
  </body>
</html>

ส่งออกตอนที่กำลังอัพโหลดเป็น~2,4 เมกะไบต์แฟ้ม

$ go run main.go
2021/11/23 22:00:14 File too large

มันก็ยังแสดงถึง"คำร้องขอขนาดใหญ่เกินไป"ในเบราว์เซอร์

ส่งออกตอนที่กำลังอัพโหลด~2,5 เมกะไบต์แฟ้ม

$ go run main.go
2021/11/23 22:03:25 File too large
2021/11/23 22:03:25 File too large

เบราว์เซอร์ตอนนี้แสดงว่าการเชื่อมต่อถูกปรับค่า

go http
2021-11-23 20:06:27
1

คำตอบที่ดีที่สุด

3

ลูกค้ากำลังพยายามส่งข้อมูลไปยังเซิร์ฟเวอร์ได้ เซิร์ฟเวอร์ไม่ได้อ่านข้อมูลของมันเป็นแค่มองหาที่ที่ส่วนหัวและปิดการเชื่อมต่อแล้ว ลูกค้าคือการแปนี้เป็น"การเชื่อมต่อถูกปรับค่า". นี่ออกไปนอกเหนือการควบคุมของคุณ.

แทนที่จะเป็นการตรวจสอบส่วนหัวที่ส่วนหัวสามารถหลอกใช้ http.MaxBytesReader เพื่ออ่านเนื้อหาจริงๆแต่เกิดข้อผิดพลาดถ้ามันใหญ่เกินไป

const MAX_UPLOAD_SIZE = 1<<20

func postHandler(w http.ResponseWriter, r *http.Request) {
    // Wrap the body in a reader that will error at MAX_UPLOAD_SIZE
    r.Body = http.MaxBytesReader(w, r.Body, MAX_UPLOAD_SIZE)

    // Read the body as normal. Check for an error.
    if err := r.ParseMultipartForm(MAX_UPLOAD_SIZE); err != nil {
        // We're assuming it errored because the body is too large.
        // There are other reasons it could error, you'll have to
        // look at err to figure that out.
        log.Println("File too large")
        http.Error(w, "Your file is too powerful", http.StatusRequestEntityTooLarge)
        return
    }

    fmt.Fprintf(w, "Upload successful")
}

เห็น ยังไงที่ต้องดำเนินการในแฟ้ม uploads เข้าไป สำหรับอีกข้อมูลเต็มสำหรับเรื่องนี้

2021-11-23 20:55:11

นี่ดูเหมือนงานต้องการขยายแล้วจริงๆเหมาะกับเพื่อความต้องการของผม แต่มันก็ยังทำให้การเชื่อมต่อปรับค่ากับผู้ใหญ่พอแล้วรูปภาพเหมือน นี้ดังนั้นสำหรับตัวอย่างเช่นถ้าฉันอยากจะเลี้ยง MAX_UPLOAD_SIZE ต้อง 20 << 20 ด้วยเหตุผลอะไรก็ตามสิ่งที่ฉันไม่สามารถอัพโหลดอะไรของตัวขนาดนั้น
urist

ฉันยังคิดว่า r.ContentLength อาจใช้เหมือนอย่างเร็วไปดูก่อนมีแฟ้มด้วยอัพโหลดทั้งหม,ถึงแม้ฉันรู้ว่ามันอาจจะเป็น spoofed. ฉันคิดว่าคุณอาจจะด้วยอะไรซักอย่างมันในลูกค้า-อยู่ด้านของตัวเอง
urist

ผมคิดว่าผมรู้แล้วว่าทำไมการเชื่อมต่อใหม่จากของฉันอยู่เหนือความเห็นคุณต้องเริ่มโดยใช้ข้อมูล(ตัวอย่างเช่นกัน r.FormFile)ไม่อย่างนั้นมันจะหยุดแล้วกลับมาและปิดการเชื่อมต่อเมื่อมันเริ่มจะมือนไม่ค่อยชอบคนอย่างต่อเนื่องข้อมูลที่ถูกส่งมาจากทายลูกค้าหน่อยสิ
urist

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่