簡體   English   中英

通過HTTP_RAW_POST_DATA將PNG文件上傳到Nginx服務器會導致圖像損壞

[英]Uploading PNG file to nginx server via HTTP_RAW_POST_DATA results in corrupted image

我試圖通過在Postman的幫助下將原始PNG圖像數據發布到服務器來調試此問題。 這是一個屏幕截圖,可能有助於理解該問題:

在此處輸入圖片說明

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

$png = $GLOBALS["HTTP_RAW_POST_DATA"];

然后,我將數據寫入一個新文件:

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

該文件已正確保存,但現在具有不同的文件大小,即417KB而不是原始文件的大小279KB。

當然,現在我不能執行任何圖像操作,因為沒有一個函數(例如getimagesize返回bool(false) )無法將文件識別為有效圖像。

我已經調試了該過程,以至於問題必須在文件操作中的某個地方,但是我不明白為什么文件不導致文件類型和大小與原始文件完全不同,這是唯一的原因我正在做的是使用相同的原始數據。

更新:

我現在已經將原始文件的編碼與上傳的文件進行了比較,前者的編碼是ISO-8859-1,並且可以正確顯示,后者的編碼是UTF-8,並且文件大小約為138kB。

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

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

現在,生成的文件確實具有相同的輸出文件大小(279kB),但仍不能識別為PNG圖像,某些信息似乎仍然丟失。

更新(1):

我已經能夠進一步檢查該問題並發現,原始文件正好比生成的文件大4個字節,因此生成的PNG似乎已損壞。

終端的屏幕截圖,顯示了兩種不同的文件大小

更新(2):

現在,我可以保存文件並將其作為有效的PNG打開。 以下代碼似乎可以正確保存圖像:

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

stream_copy_to_stream($input, $destination);

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

但是,當嘗試使用imagecreatefrompng函數打開文件時,出現500錯誤。 我現在試圖弄清楚這是否是PHP中的內存問題。

問題可能是您通過將“二進制”數據復制到文本字段中來測試POST的方式。

如果將相同的數據粘貼到文本編輯器中,則使用png擴展名保存該圖像時也不會獲得有效的圖像文件。

嘗試用文件字段構建一個簡單的表單來測試您的上傳

我使用nginx進行上傳,沒有問題,但是我使用標准的PHP方式上傳文件,具體方法如下: http : //www.php.net/manual/zh/features.file-upload.post-method。 PHP

我建議嘗試一下。

嘗試使用:<?php $ postdata = file_get_contents(“ php:// input”); ?>獲取原始數據。 我有時會用它來獲取蛋糕上ajax帖子發送的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM