1

MVC アクションでダウンロード機能を作成しようとしていますが、実際のダウンロードは機能しますが、ファイルはファイル名としてアクション名で保存されます。たとえば、以下のコードから「DownloadMP3」というファイル名を取得します。ダウンロード時に元のファイル名を保持する方法を知っている人はいますか?

[Authorize]
    public virtual FileResult DownloadMP3(string fileName)
    {
        //Actions/Download?filename=test

        //test 
        string filePath = @"~/Content/xxxxx/" + fileName + ".mp3";

        Response.AddHeader("content-disposition", "attachment;" + filePath + ";");

        return File(filePath, "audio/mpeg3");

        //for wav use audio/wav

    }
4

3 に答える 3

1

Content-Disposition ヘッダーの正しい構文は次のとおりです。

Content-Disposition: attachment; filename=foo.mp3

ただし、この場合は、3 つの引数 (3 番目の引数はファイル名) を取る File メソッドのオーバーロードを使用するだけです。添付ファイル付きの Content-Disposition ヘッダーが自動的に発行されるため、手動で追加する必要はありません (また、構文を間違えることもありません)。

また、filePath変数は、相対 URL ではなく、サーバー上の物理ファイルを指す必要があります。これに使用Server.MapPathします:

public virtual ActionResult DownloadMP3(string fileName)
{
    var downloadPath = Server.MapPath("~/Content/xxxxx/");
    fileName = Path.ChangeExtension(Path.GetFileName(fileName), "mp3");
    var file = Path.Combine(downloadPath, fileName);
    return File(file, "audio/mpeg3", fileName);
}
于 2012-05-25T07:52:16.513 に答える
0

3番目のパラメータを追加してみてください

return File(file.FullPath, file.MimeType, file.FullName);
于 2012-05-25T07:54:42.770 に答える
0

仮想パスではなく、コンテンツの配置にファイル名を入れるだけです。

    string fileOnly = fileName + ".mp3";
    string filePath = @"~/Content/xxxxx/" + fileOnly;

    Response.AddHeader("content-disposition", "attachment;" + fileOnly + ";");
于 2012-05-25T07:54:13.600 に答える