0

ユーザーが asp.net アップロード コントロールを使用してファイルをアップロードできるようにします。ファイルを一覧表示するページにリピーターがあり、ユーザーはクリックしてダウンロードできます。

    protected void grdFiles_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType != DataControlRowType.DataRow) return;

        var fileNameFull = Common.FileHelper.UploadPath + e.Row.Cells[0].Text;

        Request.MapPath(fileNameFull);

        var hyp = new HyperLink
                      {
                          NavigateUrl = fileNameFull,
                          Text = e.Row.Cells[0].Text,
                      };
        e.Row.Cells[0].Controls.Add(hyp);
    }

これは、ファイルが Web アプリケーションと同じドライブにある場合に正常に機能します。fileNameFull は次のようになります。~\Uploads\some pdf.pdf

現在の要件は、ファイルを別のドライブに保存することです。私の質問は、どうすればこれを達成できますか? Request.MapPath は明らかに仮想パスを想定しています。

ファイルは Web 経由でユーザーに公開する必要があり、セキュリティは主な関心事ではありません。

前もって感謝します。

4

3 に答える 3

1

Web サイト内でホストされていないファイルへのハイパーリンクを作成することはできません。ただし、ファイルを提供する http ハンドラーを作成できます。http ハンドラーは、クエリ文字列でファイルの識別子を受け取り、そのファイルを応答に書き出すことができます。

public class YourHttpHandler: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string filePath = Common.FileHelper.UploadPath + context.Request.QueryString["file"];
        context.Response.ContentType = "your content type";
        context.Response.WriteFile(filePath);
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

次に、ページのバインド イベントでNavigateUrl、クエリ文字列内のファイルの識別子を使用して、ハンドラーに を設定できます。このようなもの:

var hyp = new HyperLink
                      {
                          NavigateUrl = "~/YourHttpHandler.ashx?file=" + e.Row.Cells[0].Text,
                          Text = e.Row.Cells[0].Text,
                      };
于 2012-08-15T05:10:24.810 に答える
0

まず、呼び出しの結果を完全に無視しています

Request.MapPath(fileNameFull);

それは意図的なものですか?それとも書きたかったのか

fileNameFull = Request.MapPath(fileNameFull);?

次に、IIS で仮想ディレクトリを作成する必要があります。これは、ファイルが保存される場所の UNC パスにマップされます。

たとえば、仮想パス/Uploads/を UNC パスにマップできます\\extraserver\fileshare\uploads\

管理すべきセキュリティ上の問題があります (通常、Web サイトはドメイン アクセス権を持たないアカウントで実行されるため、通常は他のサーバー上の共有に接続できません。ドメイン ユーザーを選択することでこれに対処できます。接続に使用します)。

次に、Request.MapPath パスと自分のCommon.FileHelper.UploadPath部分を無視します。

ファイルの名前と連結された部分 (または、仮想ディレクトリのパス名はhttp://mywebserver/mywebsite/Uploads/どこにあるのか) を指定するだけです。Uploads

于 2012-08-15T05:09:00.663 に答える
0

さまざまなファイルをさまざまな仮想パスにマップできるようにする独自のカスタムVirtualPathProviderを作成できます。

ノート

から継承する場合VirtualPathProvider、次のメンバーをオーバーライドする必要があります。

- FileExists
- GetFile

カスタムVirtualPathProviderクラスが仮想ファイル システムのディレクトリをサポートしている場合は、次のメンバーをオーバーライドする必要があります。

- DirectoryExists
- GetDirectory
于 2012-08-15T05:03:51.890 に答える