我正在尝试用 go 编写一个程序,它有两个部分。一部分是尝试将多张图片上传到服务器的另一部分的客户端。服务器端应该做以下事情:获取将要发送的文件数循环每个文件获取文件名获取文件并保存前往 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 试试这个是个坏主意?我认为如果服务器能够在每次读取后刷新连接缓冲区就足够了,这样就不会读取和/或复制额外的信息。真的很期待帮助,提前致谢
2 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
保持您的实现到目前为止,您缺少的是io.Copy()
从源读取直到找到 EOF,因此它将一次性读取所有剩余图像。
此外,客户端必须为每个图像发送其大小(以字节为单位)(您可以在发送名称后执行此操作)。在服务器中,只需读取大小,然后使用它io.CopyN()
来读取确切的字节数。
编辑:事实上,你也可以像你正在做的那样并行而不是串行发送图像,这意味着你为每个文件传输打开一个新连接,然后读取所有文件而无需发送图像数量或其大小。
如果您想要替代方案,一个不错的选择是使用好的 'ol HTTP 和多部分请求。内置模块mime/multipart允许您通过 HTTP 进行文件传输。当然,这意味着您必须重写您的程序。
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
我的建议是压缩所有要传输的图像,然后将它们作为单个多部分 POST 请求发送。这样,您就有了了解所有验收标准的标准方式。
您可以使用以下方法轻松压缩多个文件 https://golang.org/pkg/archive/zip/
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报
0/150
提交
取消