如何使用go传输多个文件

我正在尝试用 go 编写一个程序,它有两个部分。一部分是尝试将多张图片上传到服务器的另一部分的客户端。

服务器端应该做以下事情:

  1. 获取将要发送的文件数

  2. 循环每个文件

  3. 获取文件名

  4. 获取文件并保存

  5. 前往 3

到目前为止,服务器端正在执行以下操作:

func getFileFromClient(connection net.Conn) {

    var numberOfPics int

    var err error

    var receivedBytes int64

    var fileName string

    r := bufio.NewReader(connection)

    strNumberOfPics, err := r.ReadString('\n')

    if err != nil {

        fmt.Printf("Error reading: %s\n", err)

        return

    }

    fmt.Printf("Read: %s\n", strNumberOfPics)

    strNumberOfPics = strings.Trim(strNumberOfPics, "\n")

    numberOfPics, err = strconv.Atoi(strNumberOfPics)

    if err != nil {

        fmt.Printf("Error Atoi: %s\n", err)

        panic("Atoi")

    }

    fmt.Printf("Receiving %d pics:\n", numberOfPics)

    for i := 0; i < numberOfPics; i++ {

        // Getting the file name:

        fileName, err = r.ReadString('\n')

        if err != nil {

            fmt.Printf("Error receiving: %s\n", err)

        }

        fmt.Printf("Filename: %s\n", fileName)

        fileName = strings.Trim(fileName, "\n")

        f, err := os.Create(fileName)

        defer f.Close()

        if err != nil {

            fmt.Println("Error creating file")

        }

        receivedBytes, err = io.Copy(f, connection)

        if err != nil {

            panic("Transmission error")

        }


        fmt.Printf("Transmission finished. Received: %d \n", receivedBytes)

    }

}

io.Copy 仅适用于一个文件,没有其他任何内容(因为我认为它不会清空队列)。如果我也没有,我不想每次都为每个文件重新连接。但我不确定我实际上能做些什么。


有没有人对现有的包或方法有任何建议可以提供帮助?或者示例代码?还是我完全错了,甚至用 go 试试这个是个坏主意?


我认为如果服务器能够在每次读取后刷新连接缓冲区就足够了,这样就不会读取和/或复制额外的信息。


真的很期待帮助,提前致谢


繁星coding
浏览 180回答 2
2回答

人到中年有点甜

保持您的实现到目前为止,您缺少的是io.Copy()从源读取直到找到 EOF,因此它将一次性读取所有剩余图像。此外,客户端必须为每个图像发送其大小(以字节为单位)(您可以在发送名称后执行此操作)。在服务器中,只需读取大小,然后使用它io.CopyN()来读取确切的字节数。编辑:事实上,你也可以像你正在做的那样并行而不是串行发送图像,这意味着你为每个文件传输打开一个新连接,然后读取所有文件而无需发送图像数量或其大小。如果您想要替代方案,一个不错的选择是使用好的 'ol HTTP 和多部分请求。内置模块mime/multipart允许您通过 HTTP 进行文件传输。当然,这意味着您必须重写您的程序。

泛舟湖上清波郎朗

我的建议是压缩所有要传输的图像,然后将它们作为单个多部分 POST 请求发送。这样,您就有了了解所有验收标准的标准方式。您可以使用以下方法轻松压缩多个文件&nbsp;https://golang.org/pkg/archive/zip/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go