2011-01-18 6 views
0

イムMVCのダウンロードファイル...ダウンロードするには、私のアプリケーションフォルダの外のファイルを取得しようとしているアプリのフォルダの外

public FilePathResult DownloadFile(Guid id, string dateiname) 
    { 
     string pfad = @"D:\wwwroot\portal_Daten\"; 

     return File(pfad + dateiname, "application/pdf", dateiname); 
    } 

にErrorMessage:\ wwwrootの\ portal_Daten/8/0/6 \:Dですa/e/974-aaca-426c-b7fc-e6af6c0fb52e/oeffentlichは物理パスですが、期待される仮想パスでした。

なぜこれは物理的なパスでは機能しませんか?これを仮想パスにするにはどうすればよいですか?

よろしく、あなたはそれがサーバー

の相対ディレクトリへのパスをマッピングすることができるようにServer.MapPathのを使用し、それをファイルの場所を与える必要があり フロート

答えて

2

私がパスでこれを処理した方法は、カスタムファイルのダウンロードhttpハンドラを使用することです(asp.net webformsアプリケーション)、ここでも同じことができます。 ActionResultの新しいサブクラスを作成しても、同じ結果を得ることができます。

IHttpHandlerの実装を作成し、要求を処理してファイルを返す方法でした。この方法では、仮想パスの使用に制限されず、Webサーバーのセキュリティ設定で許可されている限り、システム上の任意のファイルにアクセスしてそのファイルをブラウザに返すことができます。

のような何か:

public class MyFileHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
    get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
    string filePath = Path.Combine(@"d:\wwwroot\portal_daten", context.Request.QueryString["dateiname"]); 

    context.Response.ContentType = "application/pdf"; 
    context.Response.WriteFile(filePath); 
    } 
} 

Aはありませんチェックして例をストリップダウン、しかし、あなたはあなたのweb.configファイル内のハンドラを登録後に記入することがあります:。

<handlers> 
    <add name="MyFileHandler" path="file.axd" type="MvcApplication4.Models.MyFileHandler" verb="GET" /> 
</handlers> 

あなたがしますコースは自分自身に合うようにクラス/ネームスペースの名前を変更する必要があります。ファイルへの実際のWebリンクは、次のようになります。

http://[domain]/file.axd?dateiname=mypdf.pdf 

[ドメイン]ドメイン名/ローカルホストまたはものは何でも使っているある

+0

これはあなたを助けてくれましたか? –

+0

こんにちは、私は今日それを試してみます。私は誰にも私のウェブサーバ上のファイルにアクセスすることを躊躇していません。他の質問:仮想パスを使用するには、データを含むフォルダがアプリケーションフォルダにあるか、または? – float

+0

はい、ファイルがWebサイトのファイル構造内にある場合、通常どおり仮想パスを使用できます。私の例については、私はあなたが誤解していると思う。私はプログラマがあなたのすべてのファイルにアクセスできるようになりました。こうすることで、単純なURLを使用するだけで、仮想パスの問題を回避できます。 –

0

public FilePathResult DownloadFile(Guid id, string dateiname) 
{ 
    string pfad = Server.MapPath(@"D:\wwwroot\portal_Daten\"); 

    var filePath = Path.Combine(pfad, dateiname); 
    return File(filePath , "application/pdf", dateiname); 
} 
のようなので、何か

は役に立ちます

+0

はSystem.Webを参照する必要があります – stack72

+0

こんにちは、私は同じエラーが発生します。仮想パスが展開されます。 – float

+0

私はコードを更新しました - パスは実際には正しくありません - 今すぐ試してみてください - デバッグしましたか?pfadの価値は何ですか? – stack72

関連する問題