2017-02-22 61 views
1

我使用axios通過ajax發送一個base64字符串。使用下面的方式,當它從base64數據編碼回jpg時,我會以某種方式丟失大量數據。我怎樣才能發送這個沒有數據丟失?base64圖像imagecreatefromstring()丟失數據

我從輸入抓取文件並將其發送到

var reader = new FileReader(); 
reader.readAsDataURL(file); 

和PHP腳本接收後爲BASE64字符串被作爲Ajax和愛可信爲

axios.post('url', {main: img}) 

$incoming = json_decode(file_get_contents('php://input'))->main; 
$mainImage = str_replace('data:image/jpeg;base64,', '', $incoming); 
$img = imagecreatefromstring(base64_decode($mainImage)); 
$imageSave = imagejpeg($img, './uploaded.jpg'); 

例如,保存在服務器上的最近文件只有14k,但是我上傳到i的原始文件輸入字段爲19k。我將客戶端上傳的base64輸出到預覽div,並且該圖像保存爲19k jpg,因此我認爲它是php腳本。關於什麼導致數據丟失的任何想法?也許一些axios config value

+1

就直接保存BASE64_DECODE($ mainImage)的'結果'的文件,如:'file_put_contents( './ uploaded.jpg',BASE64_DECODE($ mainImage));'。目前,您正在創建一個新的Jpeg圖像,在保存時會稍微壓縮一些。 –

+0

@MagnusEriksson我必須將它作爲jpg保存在服務器上。我猜axios正在發送我的一串base64數據,但我不知道。我的目標是使用ajax在服務器上獲取一個jpg,所以任何不會丟失數據的方式都會很好。 – Harold

+0

嘗試上述解決方案。發生的是,前端正在發送編碼的二進制圖像數據base64。如果你只是將它解碼並保存到一個文件中(用'.jpg'-擴展名,就像我的例子),你將得到一個上傳圖像的_exact_副本。 –

回答

1

會發生什麼情況是,前端發送的是二進制圖像數據base64編碼。

目前,您正在解碼圖像,創建一個新的圖像,並保存爲JPG格式。這將只是再次壓縮圖像。

如果您只解碼數據並將其保存到文件(使用.jpg擴展名),您將得到上傳圖像的準確副本。

incoming = json_decode(file_get_contents('php://input'))->main; 
$mainImage = str_replace('data:image/jpeg;base64,', '', $incoming); 
file_put_contents('./uploaded.jpg', base64_decode($mainImage));