6

ボタンをクリックしたときに、クライアントにデータベースに保存されているファイルをダウンロードしてもらいたい。このajaxリクエストを送信し、サーバー側から取得します。

EXTJS:

downloadFile: function (a, b, c) {
    var feed_id =this.getMyfeedwindow().down('form').getComponent('FeedId').text;
    Ext.Ajax.request({
        url: '/Feed/Download',
        method: 'GET',
        params: {
            fileID: feed_id, //this.form.getComponent('file').value,
        },
        failure: function (response) {
            alert('failed  !');
        },
        success: function (response) {
            alert('success!');
        },
    });
},

次に、このコードブロックで要求に応えます。

C#:

 public void Download(string fileID){
    Response.ContentType = "application/force-download";
    Response.AddHeader("Content-Disposition", "attachment; Filename=\"Logo1.jpg\"");
    Response.BinaryWrite(data);
    Response.End();
 }

ファイアバグでネットワークをチェックしたところ、これらのパラメータでリクエストが正常に返されるようです。

Cache-Control   private
Content-Disposition attachment; filename="Logo1.jpg"
Content-Type    application/force-download
Date    Wed, 09 Jan 2013 12:51:54 GMT
Server  Microsoft-IIS/8.0
Transfer-Encoding   chunked
X-AspNet-Version    4.0.30319
X-AspNetMvc-Version 4.0
X-Powered-By    ASP.NET
X-SourceFiles   =?UTF-8?B?RTpcVXRrdUNhblxQcm9qZWN0c1xURlNcQlRPTVxCVE9NXEZlZWRcRG93bmxvYWQ=?=

正常に戻りますが、ダウンロードは開始されません。私はたくさんの質問や記事を読みましたが、ほとんどの回答は、force-downloadヘッダーを追加することで問題が解決すると言っています。どのポイントが恋しいですか?ありがとう。

4

2 に答える 2

3

ダウンロードを処理するには、提供されているヘルパーの1つを使用する必要があります

  • System.Web.MVC.FilePathResult
  • System.Web.MVC.FileStreamResult
  • System.Web.MVC.FileContentResult

ほとんどの場合、私はSystem.Web.MVC.FileStreamResultmayselfを使用しています。次のように使用します

FileStreamResult result = new FileStreamResult(stream, contentType);
result.FileDownloadName = filename; // name of the downloaded file

編集内容に基づいて一部の情報を更新する

XHRリクエストを使用してダウンロードを開始することはできません。しかし、それを行うには少なくとも2つの方法があります。

  • ファイルパスが修正されていて、それtop.location.href = "YourPath";がajax呼び出しの成功ハンドラー内に設定されていることがわかっている場合。[ top.location.hrefに関する情報]
  • その場でファイルを作成して返したい場合は、非表示のiframeを作成し、それにフォームを挿入してリクエストを実行する必要があります。
于 2013-01-09T13:33:06.020 に答える
1

いくつか検索したところlocation.href、同じことが行われ、ダウンロードダイアログボックスが開きます。サーバーからの応答にも同じヘッダーを追加する必要があります。ただし、他のアプローチが機能しない理由はまだわかりません。

var feed_id = this.getMyfeedwindow().down('form').getComponent('FeedId').text;
location.href = '/Feed/Download?fileID=' + feed_id;

これで私の問題は解決しました。

于 2013-01-09T18:34:25.110 に答える