2014-07-17 23 views
0

我正在從dataURL字符串中創建PNG圖像文件(感謝來自The PHP manual的示例)。我希望此代碼在瀏覽器中打開「下載文件」對話框,以便用戶可以在本地保存此映像,但調用函數imagepng()會將映像保存到我的服務器。撥打imagepng()時是否使用了錯誤的功能?我試圖通過更改標題來觸發下載,但它仍然保存到服務器。通過php在本地保存dataURL圖像

<?php 
$data = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl' 
    . 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr' 
    . 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r' 
    . '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg=='; 

$data = base64_decode($data); 

$im = imagecreatefromstring($data); 

// set the headers, to trigger a download 
header('Content-Disposition: attachment; filename="image.png"'); 
header('Content-Type: image/png'); 
imagepng($im, 'test_2.png'); 
imagedestroy($im); 
?> 

而且,我打電話通過下面的JavaScript的PHP,(不知道這是相關的結果我得到)

$.ajax({ 
    type: "POST", 
    url: "php/downloadimg.php", 
    dataType: 'text', 
    data: { 
     data : finishedImage.src 
    } 
}) 
+1

只是調用''imagepng''功能,無需第二個參數 – ins0

回答

1

只是調用imagepng功能,無需第二參數。如果您按照imagepng文檔中的說明讀入第二個參數,圖像將保存到該文件名。

只將圖像資源傳遞給函數,原始圖像發送給客戶端。

http://php.net/manual/de/function.imagepng.php

header('Content-Disposition: attachment; filename="image.png"'); 
header('Content-Type: image/png'); 
imagepng($im); 
imagedestroy($im); 
如果您使用PHP只有文件不使用PHP結束標記 ?>以避免泄露空格和搞砸你的輸出流

+0

大:

所以,如果你並不需要實際處理圖像服務器端這樣的事情會工作!刪除第二個參數將本地保存文件!然而,這隻有當我用這個JS調用PHP時纔有效:'window.open(「php/downloadimg.php」);'我試圖將'$ data'變量傳遞給我的PHP,所以當我打電話給它時通過 '$ .ajax({type:「POST」,url:「php/downloadimg.php」,...});' 即使成功調用了$ .ajax.done(),也不會發生下載。任何想法爲什麼? – Marquizzo

+0

不發送ajax。用''window.location ='php/downloadimg.php'替換ajax函數的孔;如果不需要發送任何其他信息到下載腳本,這個工作正常。 – ins0

+0

但是,如果我使用document.location,我將無法將變量傳遞給我的PHP,對嗎?我需要傳遞'$ data'變量,以便保存的圖像不總是相同的。我嘗試通過URL傳遞變量,比如'php/downloadimg.php?data = pdjejalkjaoseru/3jd ...',並且因爲它太長而截斷值。 – Marquizzo

1

值得注意的是,由於您已經獲得了PHP中的圖像數據,因此無需調用imagepng函數或任何類似的函數。您只需在設置標題後將圖像數據轉儲到客戶端,然後自行決定如何處理它。

<?php 
$data = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl' 
    . 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr' 
    . 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r' 
    . '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg=='; 

$data = base64_decode($data); 

// set the headers, to trigger a download 
header('Content-Disposition: attachment; filename="image.png"'); 
header('Content-Type: image/png'); 

echo $data; 
?> 
+0

這也可以通過'window.open(「downloadimg.php」)'工作,但會通過'$ .ajax({type:「POST」,url:「php/downloadimg2.php」})工作嗎?問題是我需要將'$ data'變量傳遞給PHP,因爲圖像不總是相同的。 – Marquizzo