Tamam millet, bu hata mesajının arkasındaki güvenlik nedenlerini tamamen anlıyorum, ancak bazen bir geçici çözüme ihtiyacımız var ... ve işte benimki. ASP.Net kullanıyor (bu sorunun temel aldığı JavaScript yerine) ama umarım birisi için faydalı olacaktır.
Şirket içi uygulamamız, kullanıcıların ağımıza yayılmış yararlı dosyalar için bir kısayol listesi oluşturabilecekleri bir web sayfasına sahiptir. Bu kısayollardan birine tıkladıklarında, bu dosyaları açmak istiyoruz ... ama tabii ki Chrome'un hatası bunu engelliyor.
Bu web sayfası, çeşitli kısayolları listelemek için AngularJS 1.x kullanır.
Başlangıçta, web sayfam <a href..>
dosyaları işaret eden bir öğeyi doğrudan oluşturmaya çalışıyordu , ancak bu Not allowed to load local resource
, bir kullanıcı bu bağlantılardan birini tıkladığında " " hata oluşturdu.
<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>
Çözüm, bu <a href..>
öğeleri bu kodla değiştirmek , Angular denetleyicimde bir işlev çağırmaktı ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
İşlevin kendisi çok basit ...
$scope.OpenAnExternalFile = function (filename) {
var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
window.open(URL);
}
Ve ASP.Net projemde, DownloadExternalFile.aspx
şu kodu içeren bir İşleyici dosyası ekledim :
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;
}
}
}
Ve bu kadar.
Şimdi, bir kullanıcı Kısayol bağlantılarımdan birine tıkladığında, OpenAnExternalFile
bu .ashx dosyasını açan, açmak istediğimiz dosyanın yolunu + dosya adını ileten işlevi çağırır .
Bu İşleyici kodu dosyayı yükler, ardından içeriğini HTTP yanıtına geri gönderir.
Ve iş bittiğinde web sayfası harici dosyayı açar.
Vay be! Yine - Chrome'un bu " Not allowed to load local resources
" istisnayı " " atmasının bir nedeni var, bu yüzden dikkatli davranın ... ancak bu kodu, bu sınırlamayı aşmanın oldukça basit bir yolu olduğunu göstermek için gönderiyorum.
Son bir yorum: asıl soru " C:\002.jpg
" dosyasını açmak istedi . Bunu yapamazsınız . Web siteniz tek bir sunucuya (kendi C: sürücüsüne sahip) oturacak ve kullanıcınızın kendi C: sürücüsüne doğrudan erişimi olmayacak. Dolayısıyla, yapabileceğiniz en iyi şey, bir ağ sürücüsündeki dosyalara erişmek için benimki gibi bir kod kullanmaktır.
<input type=file>
yerel enerji kaynaklarını erişmek için