很高兴能够帮助您编写这个程序！以下是使用Go语言实现这个程序的代码：

    package main

    import (
        "fmt"
        "io/ioutil"
        "log"
        "math/rand"
        "net/http"
        "os"
        "strconv"
        "strings"
        "sync"
        "time"
    )

    // 用来保存下载的图片链接地址
    var imageLinks []string

    func main() {
        // 创建一个HTTP服务器并监听端口
        http.HandleFunc("/submit", submitHandler)
        log.Fatal(http.ListenAndServe(":8080", nil))
    }

    // 提交处理程序
    func submitHandler(w http.ResponseWriter, r *http.Request) {
        if r.Method != "POST" {
            // 如果不是POST请求，返回错误
            http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
            return
        }

        // 解析POST请求体中的数据
        body, err := ioutil.ReadAll(r.Body)
        if err != nil {
            http.Error(w, "Bad Request", http.StatusBadRequest)
            return
        }
        urls := strings.Split(string(body), "\n")

        // 创建一个等待组，用于等待所有下载线程完成
        var wg sync.WaitGroup
        wg.Add(len(urls))

        // 遍历所有URL并启动下载线程
        for _, url := range urls {
            go func(url string) {
                defer wg.Done()
                downloadImage(url)
            }(url)
        }

        // 等待所有下载线程完成
        wg.Wait()

        // 生成图片链接地址并返回给访问者
        for _, link := range imageLinks {
            fmt.Fprintln(w, link)
        }
    }

    // 下载图片
    func downloadImage(url string) {
        // 发送HTTP GET请求获取图片内容
        resp, err := http.Get(url)
        if err != nil {
            log.Printf("Error downloading %s: %v", url, err)
            return
        }
        defer resp.Body.Close()

        // 解析文件名和后缀
        parts := strings.Split(url, "/")
        filename := parts[len(parts)-1]
        ext := strings.Split(filename, ".")[1]

        // 生成保存路径
        dir := "/home/user/images/"
        if _, err := os.Stat(dir); os.IsNotExist(err) {
            os.Mkdir(dir, 0755)
        }
        rand.Seed(time.Now().UnixNano())
        randStr := strconv.Itoa(rand.Intn(10000))
        savePath := fmt.Sprintf("%s%s-%s.%s", dir, time.Now().Format("2006-01-02"), randStr, ext)

        // 保存图片文件
        file, err := os.Create(savePath)
        if err != nil {
            log.Printf("Error saving %s: %v", url, err)
            return
        }
        defer file.Close()
        _, err = ioutil.ReadAll(resp.Body)
        if err != nil {
            log.Printf("Error saving %s: %v", url, err)
            return
        }
        resp.Body = ioutil.NopCloser(bytes.NewReader(b))
        _, err = io.Copy(file, resp.Body)
        if err != nil {
            log.Printf("Error saving %s: %v", url, err)
            return
        }

        // 生成图片链接地址
        link := fmt.Sprintf("http://example.com/images/%s-%s.%s", time.Now().Format("2006-01-02"), randStr, ext)

        // 添加图片
        imageLinks = append(imageLinks, link)

        // 等待随机时间间隔
        time.Sleep(time.Duration(rand.Intn(8)+3) * time.Second)
    }

这个程序的实现有以下几个步骤：

1. 创建一个HTTP服务器并监听端口。
2. 当收到POST请求时，解析请求体中的所有URL，并启动相应数量的下载线程。
3. 下载线程从每个URL下载图片，并将其保存在指定的目录下，并生成一个可以访问的链接地址。
4. 下载线程每完成一个下载任务后，就等待一个3-10秒的随机时间间隔。
5. 所有下载线程完成后，将所有生成的图片链接地址返回给访问者。

希望这个程序能够帮到您！
เรายินดีอย่างยิ่งที่จะช่วยคุณเขียนโปรแกรมนี้! ต่อไปนี้เป็นรหัสสำหรับใช้งานโปรแกรมนี้โดยใช้ภาษา Go: แพ็คเกจการนำเข้าหลัก ( "fmt" "io/ioutil" "log" "math/rand" "net/http" "os" "strconv" "strings" "sync" "time " ) // ใช้เพื่อบันทึกที่อยู่ลิงค์รูปภาพที่ดาวน์โหลด var imageLinks []string func main() { // สร้างเซิร์ฟเวอร์ HTTP และฟังพอร์ต http.HandleFunc("/submit", sendHandler) log.Fatal( http.ListenAndServe( ":8080", nil)) } // ส่งตัวจัดการ func sendHandler(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { // ถ้าไม่ใช่ POST คำขอ ส่งคืนข้อผิดพลาด http ข้อผิดพลาด (w, "ไม่อนุญาตวิธีการ", http.StatusMethodNotAllowed) กลับ } // แยกวิเคราะห์เนื้อหาข้อมูลในเนื้อหาคำขอ POST ผิดพลาด := ioutil.ReadAll(r.Body) ถ้า err != nil { http.Error(w, "Bad Request", http.StatusBadRequest) return } urls := strings.Split(string(body), "\n") // สร้างกลุ่มรอเพื่อรอให้เธรดการดาวน์โหลดทั้งหมดเสร็จสิ้น var wg sync.WaitGroup wg.Add (len(urls)) // สำรวจ URL ทั้งหมดและเริ่มเธรดการดาวน์โหลดสำหรับ _, url := range urls { go func(url string) { เลื่อน wg.Done() downloadImage(url) } (url) } // รอทั้งหมด เธรดการดาวน์โหลดเสร็จสิ้น wg.Wait() // สร้างที่อยู่ลิงก์รูปภาพและส่งคืนให้กับผู้เยี่ยมชมสำหรับ _, link := range imageLinks { fmt.Fprintln(w, link) } } // ดาวน์โหลดรูปภาพ func downloadImage(url string) { / / ส่งคำขอ HTTP GET เพื่อรับการตอบสนองเนื้อหารูปภาพ err := http.Get(url) if err != nil { log.Printf("ข้อผิดพลาดในการดาวน์โหลด %s: %v", url, err) return } เลื่อน resp.Body. Close() // แยกชื่อไฟล์และส่วนต่อท้าย := strings.Split(url, "/") ชื่อไฟล์ := parts[len(parts)-1 ] ต่อ := strings.Split(ชื่อไฟล์, ".")[1] // สร้างเส้นทางการบันทึก dir := "/home/user/images/" if _, err := os.Stat(dir); os. IsNotExist(ผิดพลาด) { os.Mkdir(dir, 0755) } rand.Seed( time.Now().UnixNano()) randStr := strconv.Itoa(rand.Intn(10000)) savePath := fmt.Sprintf(" %s%s-%s.%s", dir, time.Now( ).Format("2006-01-02"), randStr, ext) // บันทึกไฟล์ไฟล์รูปภาพ ผิดพลาด := os.Create( savePath) if err != nil { log.Printf("ข้อผิดพลาดในการบันทึก %s: % v", url, err) return } เลื่อนไฟล์.ปิด() _, err = ioutil.ReadAll(resp.Body) ถ้า err != ไม่มี { log.Printf("ข้อผิดพลาดในการบันทึก %s: %v", url, err ) return } resp.Body = ioutil.NopCloser(bytes.NewReader(b)) _, err = io.Copy (ไฟล์, resp.Body ) ถ้าผิดพลาด != nil { log.Printf("Error saving %s: %v ", url, err) return } // Generate image link address link := fmt.Sprintf("http://example.com/images /%s-%s.%s", time.Now().Format( "2006-01-02"), randStr, ext) // เพิ่มรูปภาพ imageLinks = ผนวก(imageLinks, link) // รอการสุ่ม ช่วงเวลา time.Sleep(time.Duration(rand.Intn(8)+3) * time .Second) } การใช้งานโปรแกรมนี้มีขั้นตอนดังต่อไปนี้: 1. สร้างเซิร์ฟเวอร์ HTTP และฟังบนพอร์ต 2. เมื่อได้รับคำขอ POST ให้แยกวิเคราะห์ URL ทั้งหมดในเนื้อหาคำขอ และเริ่มเธรดการดาวน์โหลดตามจำนวนที่สอดคล้องกัน 3. เธรดการดาวน์โหลดจะดาวน์โหลดรูปภาพจากแต่ละ URL บันทึกลงในไดเร็กทอรีที่ระบุ และสร้างที่อยู่ลิงก์ที่สามารถเข้าถึงได้ 4. แต่ละครั้งที่เธรดดาวน์โหลดเสร็จสิ้นภารกิจการดาวน์โหลด จะรอช่วงเวลาสุ่ม 3-10 วินาที 5. หลังจากเธรดการดาวน์โหลดทั้งหมดเสร็จสิ้น ให้ส่งคืนที่อยู่ลิงค์รูปภาพที่สร้างขึ้นทั้งหมดให้กับผู้เยี่ยมชม หวังว่าแอพนี้จะช่วยคุณได้!
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence