2010-09-02 226 views
3

看起來這個問題是定期問到的,常見的回答是「你不應該用AJAX做到這一點,只需將窗口位置設置爲文件即可。」使用JS,jQuery,如何將AJAX響應保存到(文本)文件?

但我試圖請求一個文件,實際上並不存在於服務器上的任何地方。它是在給定GET/POST上下文參數的情況下動態生成的(通過Django視圖)。我想通過AJAX檢索的文件,然後保存到客戶機,是一個文本文件(csv)。

我目前可以將文本傳送到客戶端機器(並且可以通過在日誌記錄或警報中看到它進行驗證),但無法弄清楚如何將此文本保存到AJAX成功回調函數fn中的文件中。

本質上,這是可能的,這是JS可以做的事情嗎?也就是說,要打開實際上是AJAX響應文本的「文件」的文件保存對話框?

回答

0

出於安全原因,這不是JavaScript(因此jQuery或任何其他JS框架)允許執行的操作。你可能可以做你想要的flash或其他路線,但不能使用JavaScript。請記住,Flash也有其自身的一系列安全限制。

(是的,IE可以通過ActiveX對象做到這一點,但我沒有計算,作爲一個「解決方案」在這裏)

+0

謝謝你不算IE/ActiveX作爲解決方案......我也不會。看起來這對於JS來說並不是真的可能,我想避開Flash,其他MS或專有框架。所以我可能只是使用JS來包含,填充,然後完全在幕後提交HTML表單。 – 2010-09-03 15:56:53

0

基本上沒有。由於安全限制,Javascript無法將任何內容保存到本地計算機。你最好的選擇可能是讓用戶可以信任的簽名小程序來編寫文件,或者將它放在textarea中,然後他們可以輕鬆地複製並粘貼到新文件中。

+0

文本文件可能是CSV文件中原始數據的一個巨大(幾MB)文本文件。尺寸根據用戶選項而變化...但仍可能太大而無法剪切和粘貼。雖然之前我沒有提到過......所以對於小文件,這可能是一個很好的解決方案。 – 2010-09-03 15:59:12

0

難道你不能使用這個PHP rename()函數,而不是僅僅使用Javascript?調用一個PHP文件,並將你想要複製的文件的名稱和參數一起傳遞給它?

+0

號PHP在服務器上運行,而不是在瀏覽器中運行。 – 2010-09-03 00:17:28

+0

同意了,我以爲我們一致認爲JS不能完成任務,所以我提供了一個選擇,因爲其他人都做了,但感謝冰山反正,雖然它的東西,我已經知道了。 – d2burke 2010-09-03 00:27:58

+0

我在服務器端使用Django(所以Python)...所以我得看看是否有做同樣的事情在Python的好方法。 – 2010-09-03 15:49:34

1

從瀏覽器的角度來看,文件是否存在並不重要,它只是它請求的服務器上的資源。我認爲你將需要做一些版本的「只需將窗口位置設置爲文件」。如果您將標題中的內容類型設置爲瀏覽器無法識別的內容,我相信它會詢問用戶是否要保存它。

+0

我想我要做的就是通過JS模仿表單提交。我找到了一個這樣做的jQuery插件。這不是很完美我想要什麼,但我可以立足我對這個解決方案:http://www.filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/ – 2010-09-03 15:50:45

1

正如其他人所說,你不能只用JavaScript來完成。

IMO的最佳選擇將是Flash 10+ FileReference API

有一些很好的JavaScript包裝類庫,如Downloadify提供了一個JavaScript API來訪問這些方法。請參考demo

+0

我喜歡你的解決方案。 – 2010-09-03 07:55:35

+0

感謝CMS的信息。我認爲你的解決方案效果很好(謝謝你提供了一個演示鏈接),但是我在這個項目的其他地方努力避免使用Flash。這主要是爲了兼容iPhone ......但我猜iOS不會處理文件下載。嗯......我不得不多想一想這個。 – 2010-09-03 15:54:15

0

我有同樣的問題。你可以試試這個

<button id="Save">Save</button> 
<img src="MakeThumbnail.ashx?Image=1.jpg" id="imgCrop"> 

$("#Save").click(function (e) { 
    url = $("#imgCrop").attr("src")+"&Action=Save" 
    e.preventDefault(); //stop the browser from following 
    window.location.href = url; 
});