トップ回答者
HyperLink使用時のNavigateUrlの文字化け及び接続不可

質問
回答
-
自分も試してみましたが、結果は小野さんと同じで、サーバーからの HTML 出力は URL エンコーディングされ
ますが、リンクをクリックすれば xls ファイルは問題なくダウンロードされましたが。具体例は下記のとおりです。cak00770 さんの場合はどのようになるのでしょうか?
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Data/日本語名.xls">HyperLink</asp:HyperLink>
↓
<a id="HyperLink1" href="../Data/%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%90%8D.xls">HyperLink</a>ちなみに自分の環境は Vista SP2 + .NET 3.5 SP1 + IIS7 + VS2008 Pro SP1 で、ローカル IIS モードです。
- 回答としてマーク 高橋 春樹 2009年9月1日 7:19
-
> ・・・文字化けせずに、うまくいきます。
「文字化け」ではなく URL エンコーディングされた結果なんですけど・・・
ASP.NET 1.1 の環境は持っていないので分かりませんが、ASP.NET 2.0 の HyperLink.NavigateUrl
は、URL に使ってはいけない文字コード(日本語の2バイトコードなど)を自動的に URL エンコードするよ
うです。何故、サーバー側でなくローカルディスクからファイルを取得するのか分かりませんが、file://... としてい
るところに問題があるようです。file: では、ブラウザは Web サーバにアクセスせず、直接ローカルディスク上のファイルを、URL エンコー
ドされたファイル名で開きに行くようです。だからファイルを開けないのだと思います。同じローカルディスク上のファイルでも、NavigateUrl="http://localhost/xxx/Data/日本語名.xls" とす
ればうまくいきます(xxx を仮想ディレクトリに設定する必要はありますが)。これは、ブラウザから要求を受
けた Web サーバーが、自動的に URL デコードしてからファイルを取得し、ブラウザに送るからだと思いま
す。cak00770 さんの解決手段、<a href="file:///C:\xxx\Data\日本語名.xls" ... のようにするというのも、
IE6 と IE8 のほぼデフォルトのセキュリティ設定で試してみましたが、IE6 なら開けるものの、IE8 ではダメ
でした。ついでに、FireFox 3.0.10、Opera 9.64、Safari 4.0.2 でも試してみましたがデフォルト設定では
ダメでした。というわけで、できれば、Web サーバー上にファイルを置いて、それを取得するのがよさそうです。
- 回答としてマーク 高橋 春樹 2009年9月1日 7:19
すべての返信
-
自分も試してみましたが、結果は小野さんと同じで、サーバーからの HTML 出力は URL エンコーディングされ
ますが、リンクをクリックすれば xls ファイルは問題なくダウンロードされましたが。具体例は下記のとおりです。cak00770 さんの場合はどのようになるのでしょうか?
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Data/日本語名.xls">HyperLink</asp:HyperLink>
↓
<a id="HyperLink1" href="../Data/%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%90%8D.xls">HyperLink</a>ちなみに自分の環境は Vista SP2 + .NET 3.5 SP1 + IIS7 + VS2008 Pro SP1 で、ローカル IIS モードです。
- 回答としてマーク 高橋 春樹 2009年9月1日 7:19
-
小野@どっとねっとふぁんさん、surferOnWwwさん、ありがとうございます。
実行環境:社内イントラネット用IIs5.1利用+windows 2000server+.NET3.5(asp.net2.0)
エラーが出るコード↓
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="file:///データ\日本語名.xls">HyperLink</asp:HyperLink>
但し、Visual Studio .NET 2003(.NET1.1, asp.net1.0)で作成し同様にテストすると文字化けせずに、うまくいきます。
結局、
aspのハイパーリンク使わずに下記コードなら文字化けもせず、ファイルも開きます。
<a href="file:///データ\日本語名.xls"> >日本語名.xlsを開く</a> -
> ・・・文字化けせずに、うまくいきます。
「文字化け」ではなく URL エンコーディングされた結果なんですけど・・・
ASP.NET 1.1 の環境は持っていないので分かりませんが、ASP.NET 2.0 の HyperLink.NavigateUrl
は、URL に使ってはいけない文字コード(日本語の2バイトコードなど)を自動的に URL エンコードするよ
うです。何故、サーバー側でなくローカルディスクからファイルを取得するのか分かりませんが、file://... としてい
るところに問題があるようです。file: では、ブラウザは Web サーバにアクセスせず、直接ローカルディスク上のファイルを、URL エンコー
ドされたファイル名で開きに行くようです。だからファイルを開けないのだと思います。同じローカルディスク上のファイルでも、NavigateUrl="http://localhost/xxx/Data/日本語名.xls" とす
ればうまくいきます(xxx を仮想ディレクトリに設定する必要はありますが)。これは、ブラウザから要求を受
けた Web サーバーが、自動的に URL デコードしてからファイルを取得し、ブラウザに送るからだと思いま
す。cak00770 さんの解決手段、<a href="file:///C:\xxx\Data\日本語名.xls" ... のようにするというのも、
IE6 と IE8 のほぼデフォルトのセキュリティ設定で試してみましたが、IE6 なら開けるものの、IE8 ではダメ
でした。ついでに、FireFox 3.0.10、Opera 9.64、Safari 4.0.2 でも試してみましたがデフォルト設定では
ダメでした。というわけで、できれば、Web サーバー上にファイルを置いて、それを取得するのがよさそうです。
- 回答としてマーク 高橋 春樹 2009年9月1日 7:19
-
SurferOnWwwさんありがとうございます。
リンク先のファイルは、社内共有ドメインのファイルサーバーに有り、どうしても絶対パス(file:///日本語名\日本語名フォルダ\日本語名.xls)になります。
驚きは、
> <a href="file:///C:\xxx\Data\日本語名.xls" ... のようにするというのも、
IE6 と IE8 のほぼデフォルトのセキュリティ設定で試してみましたが、IE6 なら開けるものの、IE8 ではダメ
IE8ではダメというのは、ショックです。将来的には、IE8に社内PCも変わるだろうし、
わざわざ、WEBサーバーにファイルのコピーを置くのは、不効率の一言です。
今後、こういったケースでの作成は、ASP.NET2.0ではなく、1.0で作成することで、妥協します。残念・・・・ -
こんにちは、フォーラムオペレーターの高橋春樹です。
小野@どっとねっとふぁんさん、SurferOnWwwさん
いつもお世話になっております。
動作確認をして頂き有難うございました。
cak00770さん、初めまして。
MSDNフォーラムのご利用有難うございます。回避策が見つかってよかったです(^-^)
今回、小野@どっとねっとふぁんさんとSurferOnWwwさんに動作確認をして頂き、
また、SurferOnWwwさんに問題解決に繋がるアドバイスを頂いた、
と思いましたので、勝手ながら皆さんからのアドバイスに、
回答マークを付けさせてもらいました。
もし不適切と思いましたら、回答マークを削除することも可能です。今後ともMSDNフォーラムを宜しくお願いします。
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹