瀏覽器還不支持JSON序列化表單,所以AFAIK實際上不可能使用純粹的表單發送JSON到後端。
我有兩個解決方案,不需要保存在服務器上的文件:
1)簡單的解決辦法是產生JavaScript的無形的形式,創建名json
的隱藏的輸入,並使用JSON內容填充它送到服務器。在服務器端,您將讀取表單數據並解析存儲在數據中的JSON。然後,您只需生成該文件併發送該文件作爲響應。瀏覽器應該觸發下載對話框。
var form = document.createElement('form');
form.method = 'post';
form.action = 'url';
var input = document.createElement('input');
input.type = 'hidden';
textarea.name = 'json';
textarea.value = JSON.stringify(your_json);
form.appendChild(input);
document.body.appendChild(form);
form.submit();
form.parentNode.removeChild(form);
2)第二個選項使用ajax發送數據到服務器。不過,瀏覽器需要支持多種API。
您照常執行JSON請求,並且服務器應響應標題Content-Type: here-the-MIME-type-of-your-file
和響應正文中的文件內容。
在客戶端的代碼應該是這樣的:
var json = JSON.stringify({here: ['your', 'json', 'to', 'send', 'to', 'server']});
var xhr = new XMLHttpRequest();
xhr.open('POST', '/your/api/url', true);
xhr.setRequestHeader('Content-type', 'application/json');
xhr.responseType = 'arraybuffer';
xhr.addEventListener('load', function() {
var blob = new Blob([this.response], { // reading response, not responseText
type: this.getResponseHeader('Content-Type')
});
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'file_name.txt'; // set proper extension
document.body.appendChild(a); // it needs to be added to the document in order to work
a.click();
a.parentNode.removeChild(a);
});
xhr.send(json);
而且,所創建的URL對象應該在某個時候被撤銷,否則會一直存在,直到頁面重新加載。但我認爲在用戶下載文件之前不能撤銷它們。因此,上述代碼仍然是一項任務。
「創建文件一切正常,但我的問題是獲取文件給用戶」 通過「獲取文件給用戶」我假定你的意思是讓文件到瀏覽器? 如果是這樣,在將文件保存到您的服務器後,您應該有一個到該文件的url鏈接嗎? – Zuks
'我不能發送文件給用戶ajax後'是的,你可以http://stackoverflow.com/a/20830337 – Viney
不,我沒有一個url鏈接。我在內存中創建文件 – Johan