0

ポストバックを使用して次のコードを試すと、ファイルのダウンロードは正常に行われます。

FileInfo file = new FileInfo("C:\\a.txt");
Response.ClearContent();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "text/plain";
Response.TransmitFile(file.FullName);
Response.End();

ただし、上記のコードをパブリック静的Webメソッド内に配置し、AJAXで呼び出すと、「プロセスが中止されました」などのエラーが発生します(もちろん、現在の応答を取得するには、HttpContext.Current.Responseと記述します)。 2つの応答の性質が異なること。私の質問は、それらが異なる場合、正確には何が違うのかということです。AJAXで同じことを達成する方法はありますか?

4

2 に答える 2

1

ブラウザはXHR(Ajax)呼び出しを介してファイルを受信しません。window.locationファイルの場所を返し、またはを介してブラウザをそのファイルに送信することをお勧めしますwindow.open

編集:これがWebフォームのサンプルです。私はMVCを使用しているので、Webフォームのスキルは少し錆びています。構文が頭から離れているので、少し修正する必要があるかもしれません。

ASPXページ

<div id="whateverIsContainingYourDialog">
    <form id="mikeJMIsAwesome" runat="server">
        <asp:TextBox id="firstName" runat="server" />
        <asp:TextBox id="lastName" runat="server" />

        <asp:Button id="submit" runat="server" />
    </form>
</div>

サーバーサイドコード

protected void submit_OnClick(object sender, EventArgs e) {
    //Your logic for creating the file and the code you originally posted for serving the file.
}
于 2012-12-20T17:28:08.323 に答える
1

Ek0nomikが言ったことは、ファイルのダウンロードはブラウザによって処理され、Javascriptを介して処理することはできません。応答はどちらも同じです。どちらも単なるhttp応答です。これは、fiddlerまたは別のツール(http://www.fiddler2.com/fiddler2/)で確認できます。

基本的に、ajaxメソッドはファイルの受信を処理できず、ファイルをアセンブルしてハードドライブに保存する権限がありません。

Javascriptを使用して、ユーザーがリンクをクリックするのを「偽造」することができます。

答えについては、この同様の質問を確認してください。その答えを下に貼り付けました。

JavaScriptでファイルのダウンロードを開始

そのようにします。最初にこのスクリプトを追加します。

<script type="text/javascript">
function populateIframe(id,path) 
{
    var ifrm = document.getElementById(id);
    ifrm.src = "download.php?path="+path;
}
</script>

ダウンロードボタンが必要な場所にこれを配置します(ここではリンクのみを使用します):

<iframe id="frame1" style="display:none"></iframe>
<a href="javascript:populateIframe('frame1','<?php echo $path; ?>')">download</a>
The file 'download.php' (needs to be put on your server) simply contains:

<?php 
   header("Content-Type: application/octet-stream");
   header("Content-Disposition: attachment; filename=".$_GET['path']);
   readfile($_GET['path']);
?>

したがって、リンクをクリックすると、非表示のiframeがソースファイル「download.php」を取得/開きます。パスをgetパラメーターとして使用します。これが最善の解決策だと思います!

于 2012-12-20T17:50:53.580 に答える