0

ASP MVC 3 サイトには、LAN 上のファイルを指すハイパーリンクがいくつかあります (これはイントラネット サイトです)。これらのリンクは、今日まで常に機能していました..その時点で機能するリンクは 1 つもありません。今日まで、リンクをクリックすると、ファイル (通常は .xlsx スプレッドシート) が開きました。

ファイル パスは、データベースにフィールドとして保存されます。インデックス ビューでは、このattachmentフィールドにコンテンツがある場合、このテーブル セルでペーパークリップ イメージのハイパーリンクが使用されます。ビューからのコードは次のとおりです。

    <td>
        @if (!String.IsNullOrWhiteSpace(item.Attachment))
        {
            <a href=@item.Attachment class="noLine"><img src="@Url.Content("~/Content/Images/attachment.png")" height="20px;" width="20px;"/></a>
        }            
    </td>

そして、これはこの HTML がどのようにレンダリングされるかの例です

<td>
    <a href="\\Prdhilfs03\l&amp;i-sales&amp;mkt\WORKAREA\Agencyservices\Shared\AIC\MasterListAttachments\AF.xls" class="noLine"></a>            
    <img src="/Content/Images/attachment.png" height="20px;" width="20px;">
</td>

リンクアドレスを右クリックしてコピーすると、これがクリップボードに表示されます

file://Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls

ただし、リンクを右クリックして [要素の検査] を選択し、コンソールからアンカー リンクを右クリックして [リンク アドレスのコピー] を選択すると、次のようになります。

http://localhost:2574///Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls

ヘルプや提案をいただければ幸いです。ありがとう!

編集

リンクをクリックすると、Chrome コンソールに次のエラー メッセージが表示されます。

Not allowed to load local resource: file://Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls
4

3 に答える 3

0

まず、href の前に「\\」ではなく「file://」を付けます。これにより、2 つのリンクの不一致が修正されます。

第二に、あなたの問題はクロス サイト スクリプティングに関係していると思います。あなたのブラウザは、だまされて別のサーバーからファイルをダウンロードしたくはありません (\\Prdhilfs03 は Web サーバーとは別のコンピューターであると想定しています)。

Chrome を使用してこの問題を確認するには、JavaScript コンソールを開いた状態でリンクをクリックし、「ローカル リソースの読み込みが許可されていません:」などのエラーが表示されるかどうかを確認します。

編集

エラー メッセージで確認したとおり、クロス サイト スクリプティングから保護するために、Web ブラウザーが別のサーバーからのファイルのダウンロードを妨げています。Chrome の設定を変更してこれを修正する手順について説明している記事がここにありますが、別のオプションとして、ファイルを Web サーバーにローカルに保存することもできます。

于 2013-09-05T21:50:25.650 に答える
0

クロス サイト スクリプティングの問題が発生しているというカールの回答を追加します。別の方法は、問題のファイルを FileResult として返すコントローラーを用意することです。これを FileRouter と呼びましょう。FileRouter には、次のような Download という 1 つのアクションがあります。

public FileContentResult Download(string path)
{
    return this.File(/* a stream to the path */);
}

次に、コントローラーのアクションにパスを渡します。したがって、直接リンクの代わりに、intranetserver/filerouter/download?path=path_to_file をターゲットとする Html.Action リンクを配置します。

もちろん、これにはサーバーが不必要にネットワークからファイルをロードするという欠点がありますが、考慮すべき代替手段です。

さらに、FilePathResult を使用するとここでも機能する可能性がありますが、私はそれを使用した経験がないため、ここでその有効性について主張することはできません。

于 2013-09-11T17:50:20.383 に答える
0

代わりにスラッシュを使用してみましたか。つまり、代わりに

<a href="\\Prdhilfs03\l&amp;i-sales&amp;mkt\WORKAREA\Agencyservices\Shared\AIC\MasterListAttachments\AF.xls" class="noLine"></a>

使用する

<a href="//Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls" class="noLine"></a>

URL を変換します。

var links = document.querySelectorAll("a");
for(var i=0; i<links.length; i++) {
    var link = links[i];
    var url = link.getAttribute("href");
    if(url) {
        url = url.replace(/\\/g, "/");
        link.setAttribute("href", url);
    }
}
于 2013-09-05T21:44:11.020 に答える