D'accord, je comprends parfaitement les raisons de sécurité derrière ce message d'erreur, mais parfois, nous avons besoin d'une solution de contournement ... et voici la mienne. Il utilise ASP.Net (plutôt que JavaScript, sur lequel cette question était basée) mais il sera, espérons-le, utile à quelqu'un.
Notre application interne dispose d'une page Web sur laquelle les utilisateurs peuvent créer une liste de raccourcis vers des fichiers utiles répartis sur notre réseau. Lorsqu'ils cliquent sur l'un de ces raccourcis, nous voulons ouvrir ces fichiers ... mais bien sûr, l'erreur de Chrome empêche cela.
Cette page Web utilise AngularJS 1.x pour lister les différents raccourcis.
À l'origine, ma page Web essayait de créer directement un <a href..>
élément pointant vers les fichiers, mais cela a produit l' Not allowed to load local resource
erreur " " lorsqu'un utilisateur cliquait sur l'un de ces liens.
<div ng-repeat='sc in listOfShortcuts' id="{{sc.ShtCut_ID}}" class="cssOneShortcutRecord" >
<div class="cssShortcutIcon">
<img ng-src="{{ GetIconName(sc.ShtCut_PathFilename); }}">
</div>
<div class="cssShortcutName">
<a ng-href="{{ sc.ShtCut_PathFilename }}" ng-attr-title="{{sc.ShtCut_Tooltip}}" target="_blank" >{{ sc.ShtCut_Name }}</a>
</div>
</div>
La solution était de remplacer ces <a href..>
éléments par ce code, d'appeler une fonction dans mon contrôleur angulaire ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
La fonction elle-même est très simple ...
$scope.OpenAnExternalFile = function (filename) {
//
// Open an external file (i.e. a file which ISN'T in our IIS folder)
// To do this, we get an ASP.Net Handler to manually load the file,
// then return it's contents in a Response.
//
var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
window.open(URL);
}
Et dans mon projet ASP.Net, j'ai ajouté un fichier Handler appelé DownloadExternalFile.aspx
qui contenait ce code:
namespace MikesProject.Handlers
{
/// <summary>
/// Summary description for DownloadExternalFile
/// </summary>
public class DownloadExternalFile : IHttpHandler
{
// We can't directly open a network file using Javascript, eg
// window.open("\\SomeNetworkPath\ExcelFile\MikesExcelFile.xls");
//
// Instead, we need to get Javascript to call this groovy helper class which loads such a file, then sends it to the stream.
// window.open("/Handlers/DownloadExternalFile.ashx?filename=//SomeNetworkPath/ExcelFile/MikesExcelFile.xls");
//
public void ProcessRequest(HttpContext context)
{
string pathAndFilename = context.Request["filename"]; // eg "\\SomeNetworkPath\ExcelFile\MikesExcelFile.xls"
string filename = System.IO.Path.GetFileName(pathAndFilename); // eg "MikesExcelFile.xls"
context.Response.ClearContent();
WebClient webClient = new WebClient();
using (Stream stream = webClient.OpenRead(pathAndFilename))
{
// Process image...
byte[] data1 = new byte[stream.Length];
stream.Read(data1, 0, data1.Length);
context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename));
context.Response.BinaryWrite(data1);
context.Response.Flush();
context.Response.SuppressContent = true;
context.ApplicationInstance.CompleteRequest();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
Et c'est tout.
Désormais, lorsqu'un utilisateur clique sur l'un de mes liens de raccourci, il appelle le OpenAnExternalFile
fonction, qui ouvre ce fichier .ashx, en lui passant le chemin + le nom du fichier que nous voulons ouvrir.
Ce code de gestionnaire charge le fichier, puis renvoie son contenu dans la réponse HTTP.
Et, travail fait, la page Web ouvre le fichier externe.
Phew ! Encore une fois - il y a une raison pour laquelle Chrome lance ceci "Not allowed to load local resources
" exception, alors soyez prudent avec ceci ... mais je publie ce code juste pour démontrer qu'il s'agit d'un moyen assez simple de contourner cette limitation.
Juste un dernier commentaire: la question d'origine voulait ouvrir le fichier " C:\002.jpg
". Vous ne pouvez pas faire ça. Votre site Web reposera sur un serveur (avec son propre lecteur C:) et n'a pas d'accès direct au lecteur C: de votre utilisateur. Donc, le mieux que vous puissiez faire est d'utiliser un code comme le mien pour accéder aux fichiers quelque part sur un lecteur réseau.
<input type=file>
pour accéder aux ressources locales