2011-12-13 237 views
3

我想在上傳文件時使用php代理來解決跨域問題。 在我使用php curl轉發請求和響應的腳本中,但是當請求主體是multipart/format-data時,我不知道如何將請求主體轉發到服務器。 當Content-Type標頭爲「multipart/form-data」時,file_get_contents('php:// input')將爲空。 當使用curl_setopt($ ch,CURLOPT_POSTFIELDS,$ _POST)時,可以發送請求正文中的Content-Disposition,而文件的真實數據不能。如何使用php代理轉發請求的multipart/form-data正文

我的請求體是這樣的:

------WebKitFormBoundaryd0tvwIvevPV4VTlP 
Content-Disposition: form-data; name="name" 

nbzdds.mp3 
------WebKitFormBoundaryd0tvwIvevPV4VTlP 
Content-Disposition: form-data; name="chunk" 

15 
------WebKitFormBoundaryd0tvwIvevPV4VTlP 
Content-Disposition: form-data; name="chunks" 

44 

497161 
------WebKitFormBoundaryd0tvwIvevPV4VTlP 
Content-Disposition: form-data; name="file"; filename="blob" 
Content-Type: application/octet-stream 

��v\;"S�;-�mG\u#... 
. 
. 
. 
+0

如果這是您的選擇,那麼在本地上傳文件到與本腳本相同的服務器上更容易,然後用本地服務器上傳文件的URI捲曲遠程服務器,然後遠程服務器可以下載該文件。 – wyqydsyq

+0

實際上,文件將由客戶端提供,使用html的'file'元素。你的意思是我應該先將文件緩存在我的腳本服務器上? – Hyden

+0

是的,不是讓上傳腳本嘗試將其上傳到遠程服務器,而是讓腳本在本地存儲文件,然後它應該觸發存儲服務器上的下載腳本。 您也可以在本地存儲文件,然後使用curl的FTP功能將文件從腳本服務器上傳到存儲服務器,這種方法是理想的,因爲您可以讓腳本在刪除文件的本地緩存副本後已發送到存儲服務器。 – wyqydsyq

回答

0

理想情況下,你會想存儲上傳的文件在本地,使用捲曲的FTP功能,從腳本服務器上的文件上傳到存儲服務器,然後刪除緩存文件在腳本服務器上。

如果這不可行,請發送curl請求到遠程文件服務器上的腳本,該腳本應該將文件從原始服務器下載到自身。

它可能不會像將上傳的文件直接發送到遠程文件服務器一樣快,但它本質上是相同的,除非您在將文件上傳到遠程服務器時在本地緩存文件。無論如何,這可能會更好,因爲上傳的數據不會存儲在整個操作的服務器內存中,如果同時上傳大量文件,可能會導致內存不足問題。

相關問題