2011-10-11 4 views
9

私は、(簡単には、;好みで))別のファイルサーバー上のファイルへのダウンロードリンクを作成する方法を探しています。ファイルサーバー上のファイルへのダウンロードリンクを作成する

状況は次のとおりです。私が開発しているアプリケーション(vb.netでasp.net 2.0がありますが、C#で同様の問題が発生していますが、いずれのソリューションも私のために働く)は社内で実行されます。 ファイル記憶域とWebアプリケーションは2つの別々のサーバーに置かれていることをお勧めします。

私は基本的に、ファイルにアクセスする必要がある唯一の利用可能なURLは、\ servername \ folder1 \ folder2 \ folder3 \ file.txtです。ファイル)

ウェブリンクは単に動作しません。これは現在設定されている方法です:

tablerowfield.Text = String.Format(
    "<a href=""\\servername\folder1\folder2\folder3\{0}"" 
     target=""_blank"">Click me</a>", 
    filename) 

これは明らかな理由から機能しません。以前は、そのファイルをアプリケーションパス自体に書き込むように設定されていましたが、それは完璧に機能しましたが、それは良い方法ではないため、変更する(またはしようとする)のです。

私はダウンロードページを作成してリンクを保持し、ダウンロードするための適切なWeb URLを返すテーブルをDBに置くことについて解決策を読んだが、残念ながら私が直面していた時間制約はそれを開発できない。

上記のようなファイルへの完全なファイルパスを含む文字列を提供できるとすれば、クリックするとドキュメントをダウンロードするリンクを作成する最も簡単な方法は何ですか?

注:この環境では、管理者権限はありません。それは本当に私を助けていない。上記のような正しいリンクが与えられていて、適切なファイルアクセス権などがあると仮定しましょう。

UPDATE:

上記の例では、IEではなく、FirefoxとChromeで作業を行います。 IEはそれをfile:// servername/...リンクに変換しますが、これは想定されていることを行いますが、FFとChromeは両方とも積極的に安全ではないと判断し、ブラウザから無効にしています。

答えて

16

あなたがASHXファイル(たとえば、downloadfile.ashx)を使用し、その中に次のコード(テストが、それはそのような何かになりません)を使用することができます:

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=abc.txt");            
Response.WriteFile(Server.MapPath("\\servername\folder1\folder2\folder3\abc.txt")); 
Response.End(); 

をして、あなたのアンカーでこれを使用タグのように:

<a href="downloadfile.ashx" target=""_blank"">Click me</a> 

注:

<a href="downloadfile.ashx?file=abc.txt" target=""_blank"">Click me</a> 

:あなたはまた、同様に別のファイルをダウンロードするためのパラメータを渡すことができますashxファイルで、ファイル名を使用して適切なファイルをダウンロードします。

+0

オクラホマのようなあなたのダウンロードボタンのクリックイベントにこのコードを使用することができますが、それは私のエラーをgving続けますResponse.WriteFile。私は "\\ server \ folder \ file.txt"という形式の文字列を入力して取得します。 パス '/server/folder/file.txt'のマッピングに失敗しました。可能なすべてのファイルを試しました。 この問題の経験はありますか? – Flater

+0

すでに述べたように、最初のリンクのfile = abc.txt、file = otherfile.txtなどのパラメータを渡すことができます。したがって、ファイル名を動的に取得し、ASHXファイルに渡します。あなたはクライアント側に存在しないサーバーパスを使用するのではなく、そこから(ドメインに)ダウンロードさせるためにASHXファイルが必要です – wasimbhalli

+0

私の前のポストを無視します。 .Mapathとそれは動作します:)これをファイナライズするにはまだ少し曖昧ですが、あなたは私をひどく助けてくれました!ありがとう! – Flater

0

\\servername\folder1\folder2\folder3\...は、ブラウザからは使用できないUNCパスです。ファイルは別のサーバー上にあるため、http://server-name/folder1/folder2/file.txtという形式のhref属性が必要です。

server-nameは、クライアントによって解決不能である場合は、あなたが最初のサーバーのIPアドレスを取得し、フォームのhrefを策定する必要があります。ここではhttp://10.1.1.30/folder1/folder2/file.txt

はあなたからIPアドレスを取得する方法ですサーバ名:

IPAddress[] host; 
host = Dns.GetHostAddresses("server-name"); 
string ip = host[0].ToString();   

編集:私は基本的にファイルへのダウンロードリンクを作成できるようにする必要があり

ashxソリューションでは、アプリケーションはサーバーからファイルを読み取り、ファイルサーバーから直接ファイルをダウンロードするためのリンクをクライアントに提供するのではなく、クライアントに中継します。

3

このコードは、ダウンロードフォルダにname = hi.txtという名前のファイルを作成し、「感謝の神、最終的にファイルがダウンロードされました」という内容のファイルを作成します。あなたのファイルがサーバー上にすでに存在する場合は

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=hi.txt"); 
Response.Write("thanks god, finally file got downloaded."); 
Response.End(); 
0

は、あなたは、私が働いてハンドラを得た。この

protected void downloadpdf_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=""downloadName.pdf"""); 
    Response.WriteFile(Server.MapPath(@"~/path of pdf/actualfile.pdf")); 
    Response.End(); 
} 
+0

正解ですが、この回答は、ほぼ2年前*の解決策としてマークしたものとまったく同じです。 – Flater

関連する問題