我試圖通過在Postman的幫助下將原始PNG圖像數據發佈到服務器來調試此問題。這裏有一個截圖,這可能有助於理解這個問題:通過HTTP_RAW_POST_DATA將PNG文件上傳到nginx服務器導致圖像損壞
在我收到如下文件服務器:
$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似乎已損壞。
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中的內存問題。
謝謝,但在我的情況下,我對數據如何傳遞給腳本沒有影響,所以除了讀取HTTP_RAW_POST_DATA參數外,沒有其他任何方法。 –
是不是原始發佈數據的一切,包括字段名稱等 - 這就是爲什麼它會臃腫?我還使用php://輸入,並在nginx上成功上傳文件。 –
生成的文件包含與我從中複製原始文件的數據完全相同的數據。這意味着它正確地通過服務器傳遞,問題可能在其他地方。 –