我正在嘗試用 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,因此它將一次性讀取所有剩余圖像。
此外,客戶端必須為每個圖像發送其大?。ㄒ宰止潪閱挝唬?/strong>(您可以在發送名稱后執行此操作)。在服務器中,只需讀取大小,然后使用它io.CopyN()
來讀取確切的字節數。
編輯:事實上,你也可以像你正在做的那樣并行而不是串行發送圖像,這意味著你為每個文件傳輸打開一個新連接,然后讀取所有文件而無需發送圖像數量或其大小。
如果您想要替代方案,一個不錯的選擇是使用好的 'ol HTTP 和多部分請求。內置模塊mime/multipart允許您通過 HTTP 進行文件傳輸。當然,這意味著您必須重寫您的程序。

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
我的建議是壓縮所有要傳輸的圖像,然后將它們作為單個多部分 POST 請求發送。這樣,您就有了了解所有驗收標準的標準方式。
您可以使用以下方法輕松壓縮多個文件 https://golang.org/pkg/archive/zip/
- 2 回答
- 0 關注
- 223 瀏覽
添加回答
舉報
0/150
提交
取消