2012-10-25 114 views
2

我試圖通過在Postman的幫助下將原始PNG圖像數據發佈到服務器來調試此問題。這裏有一個截圖,這可能有助於理解這個問題:通過HTTP_RAW_POST_DATA將PNG文件上傳到nginx服務器導致圖像損壞

enter image description here

在我收到如下文件服務器:

$png = $GLOBALS["HTTP_RAW_POST_DATA"]; 

然後我將數據寫入到一個新文件:

$fh = fopen($myFile, 'w') or die("can't open file"); 
fwrite($fh, $png); 
fclose($fh); 

的文件被正確保存,但現在有一個不同的文件大小, 417KB而非279KB這是origi的大小最終文件。

當然,我無法進行任何圖像操作,因爲沒有任何功能(例如getimagesize返回bool(false))將文件識別爲有效圖像。

我已經調試此過程到問題必須在文件操作的某個地方,但我不明白爲什麼該文件只是不會導致與原始文件類型和大小相同的文件我正在做的唯一的事情就是使用相同的原始數據。

UPDATE:

我現在已經比使用上傳, 而前者是ISO-8859-1,它正確地顯示原始文件的編碼,後者則是UTF-8和文件大小約爲138kB。

現在我已經實現將服務器上的文件轉換爲ISO-8859-1。

fwrite($fh, iconv("UTF-8", "ISO-8859-1", $png)); 

生成的文件現在的確有相同的輸出文件大小(279KB), 但它仍然是不被識別爲一個PNG圖像,有些信息似乎依然迷路。

UPDATE(1):

我已經能夠進一步研究這個問題,並發現了,原來的文件是一個4個字節比生成的文件越大,因此導致PNG似乎已損壞。

Screenshot of the terminal showing the two different file sizes

UPDATE(2):

我現在可以保存文件並打開它作爲一個有效的PNG。下面的代碼似乎是正確保存圖像:

$input   = fopen("php://input","r+"); 
$destination = fopen($myFile, 'w+'); 

stream_copy_to_stream($input, $destination); 

fclose($input); 
fclose($destination); 

然而試圖打開與imagecreatefrompng函數的文件時,我得到一個500錯誤。我現在試圖弄清楚它是否是PHP中的內存問題。

回答

0

我使用nginx的上載,並沒有問題,但是我用的文件上傳爲每標準的PHP方式:http://www.php.net/manual/en/features.file-upload.post-method.php

我會建議嘗試這一點。

+0

謝謝,但在我的情況下,我對數據如何傳遞給腳本沒有影響,所以除了讀取HTTP_RAW_POST_DATA參數外,沒有其他任何方法。 –

+0

是不是原始發佈數據的一切,包括字段名稱等 - 這就是爲什麼它會臃腫?我還使用php://輸入,並在nginx上成功上傳文件。 –

+0

生成的文件包含與我從中複製原始文件的數據完全相同的數據。這意味着它正確地通過服務器傳遞,問題可能在其他地方。 –

1

問題可能是您通過將「二進制」數據複製到文本字段來測試POST的方式。

如果將相同的數據粘貼到文本編輯器中,當使用png擴展名保存時,您將無法獲得有效的圖像文件。

嘗試建立一個簡單的表格文件中的字段來測試你的上傳

+0

我在Smultron中打開了該文件,複製了原始數據,打開了另一個文檔,粘貼了數據,將編碼更改爲與原始文件(ISO-5589-1)相同並保存。結果輸出是一個功能完好的PNG圖像。問題不在於我的測試,而在於編碼/寫入文件的地方。 –

0

嘗試使用:< PHP $ POSTDATA =的file_get_contents( 「PHP://輸入」)?; ?> 獲取原始數據。我多次使用它來獲取從ajax郵件發送到蛋糕上的數據。

+0

謝謝,我用你提出的建議替換了這條線,但是我仍然遇到問題,請參閱我的帖子的更新。 –

相關問題