ठीक है दोस्तों, मैं पूरी तरह से इस त्रुटि संदेश के पीछे सुरक्षा कारणों को समझता हूं, लेकिन कभी-कभी, हमें वर्कअराउंड की आवश्यकता होती है ... और यहां मेरा है। यह ASP.Net का उपयोग करता है (जावास्क्रिप्ट के बजाय, जो यह प्रश्न आधारित था) लेकिन यह उम्मीद है कि किसी के लिए उपयोगी होगा।
हमारे इन-हाउस ऐप में एक वेबपेज है जहां उपयोगकर्ता हमारे पूरे नेटवर्क में फैली उपयोगी फाइलों के शॉर्टकट की सूची बना सकते हैं। जब वे इनमें से किसी एक शॉर्टकट पर क्लिक करते हैं, तो हम इन फ़ाइलों को खोलना चाहते हैं ... लेकिन निश्चित रूप से, क्रोम की त्रुटि इसे रोकती है।
यह वेबपेज विभिन्न शॉर्टकट को सूचीबद्ध करने के लिए AngularJS 1.x का उपयोग करता है।
मूल रूप से, मेरा वेबपेज <a href..>
फ़ाइलों पर इंगित करने वाले एक तत्व को सीधे बनाने का प्रयास कर रहा था , लेकिन Not allowed to load local resource
जब उपयोगकर्ता इनमें से किसी एक लिंक पर क्लिक करता है तो यह " " त्रुटि उत्पन्न करता है ।
<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>
समाधान उन <a href..>
तत्वों को इस कोड के साथ बदलने के लिए था , जो मेरे कोणीय नियंत्रक में एक फ़ंक्शन को कॉल करने के लिए ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
समारोह ही बहुत सरल है ...
$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);
}
और अपने ASP.Net प्रोजेक्ट में, मैंने एक हैंडलर फ़ाइल जोड़ी है, DownloadExternalFile.aspx
जिसमें यह कोड शामिल है:
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;
}
}
}
और बस।
अब, जब कोई उपयोगकर्ता मेरे शॉर्टकट लिंक में से किसी एक पर क्लिक करता है, तो वह OpenAnExternalFile
फ़ंक्शन को कॉल करता है, जो इस .ashx फ़ाइल को खोलता है, इसे उस फ़ाइल के पथ + फ़ाइल नाम से गुजरता है जिसे हम खोलना चाहते हैं।
यह हैंडलर कोड फ़ाइल को लोड करता है, फिर इसे HTTP प्रतिसाद में वापस भेज देता है।
और, काम किया, वेबपेज बाहरी फाइल को खोलता है।
काहे! फिर से - एक कारण है कि क्रोम इस Not allowed to load local resources
अपवाद को फेंकता है, इसलिए इसके साथ सावधानी से चलें ... लेकिन मैं इस कोड को सिर्फ यह प्रदर्शित करने के लिए पोस्ट कर रहा हूं कि यह इस सीमा के आसपास काफी सरल तरीका है।
सिर्फ एक आखिरी टिप्पणी: मूल प्रश्न " C:\002.jpg
" फाइल को खोलना चाहता था । आप ऐसा नहीं कर सकते । आपकी वेबसाइट एक सर्वर पर बैठेगी (यह स्वयं C: ड्राइव है) और आपके उपयोगकर्ता की C: ड्राइव पर कोई सीधी पहुँच नहीं है। तो आप जो सबसे अच्छा कर सकते हैं वह नेटवर्क ड्राइव पर फ़ाइलों को एक्सेस करने के लिए खान की तरह कोड का उपयोग करना है।
<input type=file>
स्थानीय reources तक पहुँच प्राप्त करने