2017-05-30 33 views
0

我對Golang完全陌生。我正試圖從客戶端發送文件到服務器。客戶端應該將其拆分成更小的塊並將其發送到服務器公開的其餘端點。服務器應該結合這些塊並保存它。無法將數據以塊的形式發送到Golang中的服務器

這是我寫到目前爲止的clientserver代碼。當我運行它來複制大小爲39字節的文件時,客戶端向服務器發送兩個請求。但服務器顯示以下錯誤。

2017/05/30 20:19:28 Was not able to access the uploaded file: unexpected EOF 
2017/05/30 20:19:28 Was not able to access the uploaded file: multipart: NextPart: EOF 
+0

我不認爲表單數據是任意二進制數據的正確內容類型。我相信它應該是application/octet-stream。請參閱https://stackoverflow.com/questions/14962592/whats-content-type-value-within-a-http-request-when-uploading-content – Adrian

回答

1

您正在將緩衝區與文件分成不同的塊並將它們分別作爲單獨的HTTP消息發送。這不是如何打算使用multipart

multipart MIME意味着一個單個 HTTP消息可以包含一個或多個實體,引述HTTP RFC

MIME提供了一種用於數字「多」類型 - 內 一個或多個實體的封裝一個消息體。在RFC 2046

的5.1.1節中定義的所有多塊類型 都有一個共同的語法,你應該發送整個文件,並在一個HTTP消息發送它(文件內容應該是一個單一的實體)。 HTTP協議將負責其餘部分,但如果您計劃傳輸的文件很大(如> 2GB),則可以考慮使用FTP。

+0

如果我發送一個大文件,將它作爲單個HTTP發送要求? – pseudonym

0

如果您使用的是multipart/form-data,那麼需要將整個文件作爲單個字節流發送。 Go可以通過這種方式輕鬆處理多GB文件。但是你的代碼需要對此很聰明。

  • ioutil.ReadAll(r.Body)是不可能的,除非您確定文件將會非常小。請不要這樣做。
  • multipartReader, err := r.MultipartReader()使用多部分閱讀器。這將按照它們包含在編碼中的順序迭代上傳文件。這很重要,因爲您可以將文件完全保留在內存之外,並從一個文件句柄執行Copy。這是如何輕鬆處理大文件。
  • 您將遇到中間盒和反向代理問題。我們必須在Nginx中更改默認值,以便它不會切斷大文件。 Nginx(或者你可能使用的任何反向代理)需要合作,因爲他們通常會默認一些非常小的文件大小,例如300MB。
  • 即使您認爲您使用某些文件部分技巧處理上傳時遇到此問題,您將需要處理大文件下載。 Go可以通過從文件句柄到文件句柄執行Copy來非常高效地執行單個大文件。如果您希望下載您上傳的文件的性能很好,您最終還需要支持部分內容(http 206),而不需要修改(304)。有些瀏覽器會忽略你的請求,以避免在涉及大型視頻等情況時不要求部分內容。所以,如果你不支持這一點,那麼一些內容將無法下載。

如果您想使用一些技巧來分割文件並將它們分開發送,那麼您最終需要使用特定的Javascript庫。如果您要從任何客戶端到您的Go服務器進行編程訪問,這對互操作性會非常有害。但是,也許你無法修復施加大小限制的中間框,而且你真的想將文件剪切成塊。您將有很多工作來處理下載您設法上傳的文件。

-1

你想要做的是用大多數其他語言編寫的帶有tcp連接的典型代碼,在GO中你也可以用net.Listen來使用tcp,並最終接受listener對象。那麼這應該沒問題。

相關問題