1

ビューに表示されているテーブルの内容を CSV ファイルとしてダウンロードする必要があります。テーブルの内容を適切にフォーマットして、.csv ファイルとして保存できるようにするコードがあります (たとえば、列の区切り記号はコンマで、テーブルの各レコードは新しい行にあります)。

したがって、コントローラーには次のコードがあります。

window.location.href = '/download?data=' + encodeURIComponent($scope.csvString);

サーバー部分にNodeJを使用しています。ここには、次のルート ハンドラがあります。

app.get('/download', function (req, res) {
    var data = req.query.data;

    res.attachment('data.csv');
    res.setHeader('Content-Type', 'text/csv');
    res.end(data);
});

これは完全に正常に機能します。ダウンロードは機能し、ダウンロードされたファイルのデータは完全な CSV 形式です。問題ない。

この問題は、テーブル内のレコードが多すぎる場合、つまりデータが巨大な場合に発生します。このため、クエリ パラメータは非常に大きく、制限を超えていると想定しているため、GET リクエストは 400 (Bad Request) エラーで返されます。私の分析によると、リクエストはサーバーに到達しないことに注意してください。 Chrome 開発者ツールを使用してリクエストが失敗したことを確認しました。ブラウザでは、URL は単純にwww.my_domain.com/download?data=the_lengthy_data. それでおしまい。Web ページが空白または空で、ファイルがダウンロードされていません。

したがって、長いデータをダウンロードする方法を知りたいですか? 私が遭遇したすべての例は GET リクエストを行うため、長いデータをクエリ パラメータとして渡す必要があります。他のアプローチはありますか?

4

3 に答える 3

5

あなたの質問に対する答えではありませんが、見た目からすると、クライアントで生成されたデータのダウンロードを「強制」しようとしています。次に、この場合、データを直接含むデータ URI を作成できます。

Angular JS テンプレート:

<a href="data:base64,{{btoa(csvString)}}" download>Download CSV</a>

あなたのコントローラー:

$scope.btoa = function (val) {
    return btoa(val);
};

その結果、DOM は次のようになります。

<!-- The link contains data to the CSV string "a,b,c" -->
<a href="data:text/csv;base64,YSxiLGM=" download>Download CSV</a>

リンクをクリックすると、CSV ファイルがダウンロードされます。

編集

FileSaver.jsというライブラリを使用して文字列を強制的にダウンロードすることもできます。

いつものように CSV を取得しますが、今回は BLOB に変換します。

var csvBlob = new Blob([$scope.csvString], { type: 'text/csv;charset=utf-8' });

そして、FileSaver.js のsaveAs関数を呼び出すことができます。

saveAs(csvBlob, 'mydata.csv');
于 2013-09-06T17:22:03.880 に答える
0

URL の文字数制限については正しいです。一般に、長いデータは本文を通過します。これは、理論上、文字制限がないためです。

ただし、GET 要求で本文を渡そうとすることは避ける必要があります。send メソッドの XMLHttpRequest 仕様には、「リクエスト メソッドが GET または HEAD の場合、データを null に設定する」と記載されています。

したがって、POST リクエストを使用して、本文にパラメーターを渡すことをお勧めします。したがって、 app.post('download', ...) を使用してハンドラーを書き直し、その後、これらのパラメーターの request.body を解析する必要もあります。

また、あなたがやろうとしていることを理解していることから、サーバーによって処理されて返されるデータのブロックを提供しているため、POST はより適切な HTTP 動詞のようです。

于 2013-09-06T17:08:49.397 に答える