3

MP3ファイルを指すアンカーリンクがページにあります。Right-click + Save Target As..このファイルをダウンロードできるようにしたいのですが、リンクを1回クリックするだけでもダウンロードできます。

現在、ブラウザが異なれば動作も異なるという問題に直面しています。IEはファイルをWMPで再生し、Firefoxはダウンロードボックスを表示し、Chromeはファイルのインライン再生を開始します。シングルクリックで予想される動作は、ブラウザがファイルをダウンロードするか、ダウンロードダイアログを表示することです。

私は以下を試しました:

  • ページ上に非表示を作成し、iframeそれをアンカーリンクのターゲットとして指定します。また、この中のアクションとして目的のMP3ファイルの場所を使用してフォームを作成し、iframeアンカーリンククリックイベントでフォームを送信してみました。
  • window.location = MP3 URLリンククリックの設定
  • の複数の組み合わせを試しましたwindow.open

これらのどれも私を助けることができませんでした。リンクをクリックしてもダウンロードダイアログが表示されません。

無実のアンカーリンクは次のようになります。

<a id="someID" href="myMP3file" target="whatever" title="Download" class="someClass">Download Me!</a>
4

3 に答える 3

1

@CrabBucket-これが私の問題を解決した方法です!! 私にとってはうまく機能します:)このサーバー側からこのダウンロードを開始するためにコントローラーアクションを使用していました(これがハンドラーを使用しなかった理由です)。コントローラーからhttp応答を返すのは最初は難しいように見えましたが、それから私は物事をだます方法を考え出しました;)コントローラーアクション内に次のコードを書かなければなりませんでした-

{
    HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(FileURL);
    HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

    Stream myStream = myResponse.GetResponseStream();

    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment; filename=\"SaveMe.MP3\"");

    var readBytes = 10000000;
    var myAudResponse = new byte[readBytes];
    int fileLength;
    do {
        fileLength = myStream.Read(myAudResponse, 0, (int)readBytes);
        Response.OutputStream.Write(myAudResponse, 0, fileLength);
        Response.Flush();
    } while (fileLength > 0);
    myStream.Close();

    return new EmptyResult();
}

あなたの知恵に従って基本的なTry-Catchなどを使用してください:)さまざまなWebフォーラムとCrabBucket(コードを投稿した場所からのSOの質問、非常に助けになった答えがありました!)に感謝します。言って!


複数の編集でごめんなさい!私のコードは一瞬失敗しました。私は、ループは常に行く方法だと思います!!!

于 2012-05-11T17:51:19.903 に答える
1

適切な回答の始まりを投稿するだけです。http ハンドラー (.ashx) ファイルを使用して、これらのファイルのカスタム処理をコード化すると思います。このチュートリアルでは例を示します。

あなたのリンクは次のようなものになります

<a href="MyMp3Handler.ashx?fileName=MyFile">Click here to download</a>

ハンドラーはストリーミング作業を行います。

ハンドラーがどのように見えるかの例 (このSO の質問に基づく)

public void ProcessRequest (HttpContext context) {

    var filePath = Server.MapPath(context.Request.QueryString["fileName"].ToString()) + ".mp3";          
    if (!File.Exists(filePath))             
        return;          

    var fileInfo = new System.IO.FileInfo(filePath);         
    Response.ContentType = "application/octet-stream";         
    Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", filePath));         
    Response.AddHeader("Content-Length", fileInfo.Length.ToString());         
    Response.WriteFile(filePath);         
    Response.End();
}

ハンドラーも web.config に登録する必要があります。

ただし、これは私の頭の中から外れているため、コードを機能させるには微調整が必​​要です。どうやって始めようか考えてみた

追記事項

同僚が指摘したところによると、コンテンツ タイプが設定されていても、application/octet-streamそれがどのようにレンダリングされるかはブラウザの実装次第であるため、ストリーミングできない可能性があります。それは私が似たようなことをしたと言っていましたが、PHPで、Firefox、IE、およびChromeでmp3ファイルをストリーミングしたので、原則は機能します。それがあなたの質問にタグ付けされたものであるため、asp.netで例を提供しました。

于 2012-05-09T13:29:17.940 に答える