Được rồi mọi người, tôi hoàn toàn hiểu lý do bảo mật đằng sau thông báo lỗi này, nhưng đôi khi, chúng tôi cần một giải pháp thay thế ... và đây là của tôi. Nó sử dụng ASP.Net (thay vì JavaScript, câu hỏi này dựa trên) nhưng hy vọng nó sẽ hữu ích cho ai đó.
Ứng dụng nội bộ của chúng tôi có một trang web nơi người dùng có thể tạo danh sách các phím tắt cho các tệp hữu ích trải khắp mạng của chúng tôi. Khi họ nhấp vào một trong các phím tắt này, chúng tôi muốn mở các tệp này ... nhưng tất nhiên, lỗi của Chrome ngăn cản điều này.
Trang web này sử dụng AngularJS 1.x để liệt kê các phím tắt khác nhau.
Ban đầu, trang web của tôi đang cố gắng tạo trực tiếp một <a href..>
phần tử trỏ đến các tệp, nhưng điều này đã tạo ra Not allowed to load local resource
lỗi "" khi người dùng nhấp vào một trong các liên kết này.
<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>
Giải pháp là thay thế các <a href..>
phần tử đó bằng mã này, để gọi một hàm trong bộ điều khiển Angular của tôi ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
Bản thân chức năng này rất đơn giản ...
$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);
}
Và trong dự án ASP.Net của tôi, tôi đã thêm một tệp Xử lý có tên DownloadExternalFile.aspx
chứa mã này:
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;
}
}
}
Và đó là nó.
Bây giờ, khi người dùng nhấp vào một trong các liên kết Phím tắt của tôi, nó sẽ gọi OpenAnExternalFile
hàm mở tệp .ashx này, chuyển cho nó đường dẫn + tên tệp của tệp mà chúng ta muốn mở.
Mã Xử lý này tải tệp, sau đó chuyển nội dung của tệp trở lại trong phản hồi HTTP.
Và, công việc đã hoàn thành, trang web sẽ mở tệp bên ngoài.
Phù! Một lần nữa - có một lý do tại sao Chrome ném Not allowed to load local resources
ngoại lệ "" này, vì vậy hãy cẩn thận với điều này ... nhưng tôi đăng mã này chỉ để chứng minh rằng đây là một cách khá đơn giản để giải quyết hạn chế này.
Chỉ một nhận xét cuối cùng: câu hỏi ban đầu muốn mở tệp " C:\002.jpg
". Bạn không thể làm điều này. Trang web của bạn sẽ nằm trên một máy chủ (với ổ C: riêng của nó) và không có quyền truy cập trực tiếp vào ổ C: của chính người dùng của bạn. Vì vậy, tốt nhất bạn có thể làm là sử dụng mã như của tôi để truy cập các tệp ở đâu đó trên ổ đĩa mạng.
<input type=file>
để có được quyền truy cập vào reources địa phương