2013-12-21 90 views
0

我遇到了一個代碼,應該生成一個svg文件下載,而不保存在服務器本身的問題。我已經設法達到了一個點,其中有一些代碼在其中下載文件,但不是實際的$數據本身。發佈數據與jquery到php文件下載svg文件

因此,切除不必要的東西出來,HTML按鈕啓動的JavaScript ...

<button type="button" onclick="toSVG()">Save SVG</button> 

哪些職位準備數據的PHP文件...

var data = $svgDiv.html(); 
$.post('./saveSVG.php', 
     {'data': data}, 
     function(data){ 
      window.location = 'saveSVG.php'; 
     } 
); 

應該保存diagram.svg到硬盤..

<?php 
$data = $_POST['data']; 
$file = "diagram.svg"; 

header('Content-type: image/svg+xml'); 
header("Content-Disposition: attachment; filename=$file"); 

echo('<?xml version="1.0" encoding="iso-8859-1"?>' . "\n"); 
echo('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN" "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">' . "\n"); 
echo $data; ?> 

但下載的diagram.svg只包含前兩個回聲,並且$ data i是空的。

在瀏覽器的「網絡訪問」窗口中,我注意到saveSVG.php出現兩次,並且在POST方法狀態設置爲OK並且$ data被正確回顯,而GET狀態設置爲'取消'我剛剛下載的文件(與空$數據ofc ..)

我只是不明白:) 有人能幫我理解爲什麼這不起作用嗎?

回答

2

首先您發表的帖子調用saveSVG.php 後的數據:

$.post('./saveSVG.php', 
    {'data': data}, 

這請求後,返回你想響應(datafunction(data){)重定向到saveSVG.php 的發佈數據:window.location = 'saveSVG.php';

所以第二個電話,你的實際下載,是空的。

嘗試這種方式(無$。員額在所有):

window.location = 'saveSVG.php?data=' + $svgDiv.html(); 

而且在你的PHP:

$data = $_GET['data']; 
+0

謝謝!看起來它會工作..有一天。我必須刪除.serialize()方法,因爲我試圖在我的$ data中發送原始svg標記,並且在渲染下載的文件時出現錯誤。我需要找出問題是否存在於我的svg標記中,或者是因爲刪除了.serialize()方法。爲什麼你首先添加了它? – user3125632

+0

首先,serialize()不正確。我刪除它。 ;)如果你無法弄清楚,你的剩餘問題應該發佈在另一個問題上。 –

+0

啊,好的:D Thx很多! – user3125632

0

我類似的問題掙扎得厲害。上述解決方案中的GET方法適用於小數據,但不適用於我的全尺寸數據。在OP中改變爲JQuery AJAX .post()給了我與OP完全相同的問題 - 服務器端PHP代碼正在運行,但沒有給我保存的文件。我終於意識到,AJAX正是我不想在這種情況下。

我的解決方案是一個簡單的表單,隱藏字段包含要發佈的數據。加載頁面時,隱藏輸入的值爲「0」,但在onsubmit事件中由javascript代碼替換爲SVG數據。
這是形式:

<form name="myform" method="post" action="save_php.php" onsubmit="DoSubmit();"> 
<input type="hidden" name="post_data" value="0" /> 
<input type="submit" name="submit" value="Save SVG"/> 
</form> 

在我的頁面上,SVG代碼我想的與id="live_svg"顯示在<div>副本。這是JavaScript代碼在onsubmit事件添加代碼隱藏的輸入值:

<script> 
// Submit the form with post data 
function DoSubmit(){ 
    document.myform.post_data.value = $('#live_svg').html(); 
    return true; 
} 
</script> 

最後,服務器端PHP只是讀$ _ POST,並設置內容標頭輸出的文件準備好保存:

<?php 
$data = $_POST["post_data"]; 
$file = "diagram.svg"; 

header('Content-type: image/svg+xml'); 
header("Content-Disposition: attachment; filename=$file"); 

echo('<?xml version="1.0" encoding="iso-8859-1"?>' . "\n"); 
echo('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN" "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">' . "\n"); 
echo $data; 
?> 

我很尷尬地承認,這讓我弄了多久!但是如果沒有OP,以及上面的答案,我就無法做到。謝謝!