ブラウザは(まだ)フォームのJSONシリアル化をサポートしていないため、純粋なフォームを使用してJSONをバックエンドに送信することは実際には不可能です。
1)簡単な解決策は、JavaScriptで目に見えないフォームを生成名前json
の隠し入力を作成して送信するためにJSONコンテンツを移入するために、次のようになります。
は、私は、サーバー上のファイルを保存する必要はありません2つのソリューションを持っていますサーバーに送信します。サーバー側では、フォームデータを読み込み、データに格納されている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)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オブジェクトは、そうでない場合は、ページをリロードするまで存在しますが、ある時点で取り消されるべきです。しかし、私は彼らがファイルをダウンロードする前に取り消すことはできないと思う。だから、上記のコードではまだ1つのタスクがあります。
「ファイルをすべて作成するとうまくいくが、問題はユーザーにファイルが届いている」 「ファイルをユーザーに取得する」とは、ファイルをブラウザに取得することを意味しますか? その場合、ファイルをサーバーに保存した後、そのファイルへのURLリンクが必要ですか? – Zuks
'ajax投稿の後にユーザーにファイルを送信することはできません。 'はいできます。http://stackoverflow.com/a/20830337 – Viney
いいえ、私はURLリンクがありません。私はメモリにファイルを作成します – Johan