Dobra ludzie, całkowicie rozumiem powody bezpieczeństwa stojące za tym komunikatem o błędzie, ale czasami potrzebujemy obejścia ... i oto moje. Używa ASP.Net (zamiast JavaScript, na którym opierało się to pytanie), ale mam nadzieję, że przyda się komuś.
Nasza wewnętrzna aplikacja ma stronę internetową, na której użytkownicy mogą tworzyć listy skrótów do przydatnych plików rozsianych po całej naszej sieci. Kiedy klikną jeden z tych skrótów, chcemy otworzyć te pliki ... ale oczywiście błąd Chrome zapobiega temu.
Ta strona używa AngularJS 1.x do wyświetlania listy różnych skrótów.
Początkowo moja strona internetowa próbowała bezpośrednio utworzyć <a href..>
element wskazujący na pliki, ale spowodowało to Not allowed to load local resource
błąd „ ”, gdy użytkownik kliknął jeden z tych odsyłaczy.
<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>
Rozwiązaniem było zastąpienie tych <a href..>
elementów tym kodem, aby wywołać funkcję w moim kontrolerze Angular ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
Sama funkcja jest bardzo prosta ...
$scope.OpenAnExternalFile = function (filename) {
var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
window.open(URL);
}
W moim projekcie ASP.Net dodałem plik Handler o nazwie, DownloadExternalFile.aspx
który zawierał ten kod:
namespace MikesProject.Handlers
{
public class DownloadExternalFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string pathAndFilename = context.Request["filename"];
string filename = System.IO.Path.GetFileName(pathAndFilename);
context.Response.ClearContent();
WebClient webClient = new WebClient();
using (Stream stream = webClient.OpenRead(pathAndFilename))
{
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;
}
}
}
I to wszystko.
Teraz, gdy użytkownik kliknie jedno z moich łączy Skrótów, wywołuje OpenAnExternalFile
funkcję, która otwiera ten plik .ashx, przekazując mu ścieżkę + nazwę pliku, który chcemy otworzyć.
Ten kod obsługi ładuje plik, a następnie przekazuje jego zawartość z powrotem w odpowiedzi HTTP.
Po wykonaniu zadania strona internetowa otwiera zewnętrzny plik.
Uff! Ponownie - istnieje powód, dla którego Chrome wyrzuca ten „Not allowed to load local resources
” wyjątek, więc postępuj ostrożnie z tym… ale publikuję ten kod tylko po to, aby zademonstrować, że jest to dość prosty sposób obejścia tego ograniczenia.
Jeszcze tylko jeden komentarz: pierwotne pytanie dotyczyło otwarcia pliku „C:\002.jpg
”. Nie możesz tego zrobić. Twoja witryna będzie znajdować się na jednym serwerze (z własnym dyskiem C:) i nie będzie mieć bezpośredniego dostępu do własnego dysku C: użytkownika. Więc najlepsze, co możesz zrobić, to użyć kodu takiego jak mój, aby uzyskać dostęp do plików gdzieś na dysku sieciowym.
<input type=file>
aby uzyskać dostęp do lokalnych zasobów