โอเคฉันเข้าใจเหตุผลด้านความปลอดภัยที่อยู่เบื้องหลังข้อความแสดงข้อผิดพลาดนี้แล้ว แต่บางครั้งเราก็ต้องการวิธีแก้ปัญหา ... และนี่คือของฉัน ใช้ ASP.Net (แทนที่จะเป็น JavaScript ซึ่งเป็นคำถามนี้) แต่หวังว่าจะมีประโยชน์กับใครบางคน
แอปภายในของเรามีหน้าเว็บที่ผู้ใช้สามารถสร้างรายการทางลัดไปยังไฟล์ที่มีประโยชน์ซึ่งกระจายอยู่ทั่วเครือข่ายของเรา เมื่อคลิกที่ทางลัดเหล่านี้เราต้องการเปิดไฟล์เหล่านี้ ... แต่แน่นอนข้อผิดพลาดของ Chrome ป้องกันสิ่งนี้
หน้าเว็บนี้ใช้ 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) {
var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
window.open(URL);
}
และในโครงการ ASP.Net ของฉันฉันได้เพิ่มไฟล์ Handler ที่เรียกว่าDownloadExternalFile.aspx
ซึ่งมีรหัสนี้:
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;
}
}
}
และนั่นแหล่ะ
ตอนนี้เมื่อผู้ใช้คลิกที่ลิงค์ทางลัดอันใดอันหนึ่งของฉันมันจะเรียกใช้OpenAnExternalFile
ฟังก์ชันนี้ซึ่งจะเปิดไฟล์. asx นี้โดยส่งผ่านเส้นทาง + ชื่อไฟล์ของไฟล์ที่เราต้องการเปิด
โค้ดตัวจัดการนี้จะโหลดไฟล์จากนั้นส่งเนื้อหากลับไปในการตอบสนอง HTTP
และเมื่องานเสร็จแล้วหน้าเว็บจะเปิดไฟล์ภายนอก
ฟิ้ว! อีกครั้ง - มีเหตุผลว่าทำไม Chrome จึงโยนNot allowed to load local resources
ข้อยกเว้น "" นี้ออกไปดังนั้นควรระมัดระวังในเรื่องนี้ ... แต่ฉันโพสต์รหัสนี้เพื่อแสดงให้เห็นว่านี่เป็นวิธีที่ค่อนข้างง่ายสำหรับข้อ จำกัด นี้
เพียงความคิดเห็นสุดท้าย: คำถามเดิมต้องการเปิดไฟล์ " C:\002.jpg
" คุณไม่สามารถทำสิ่งนี้ได้ เว็บไซต์ของคุณจะนั่งบนเซิร์ฟเวอร์เดียว (โดยมีไดรฟ์ C: เป็นของตัวเอง) และไม่มีการเข้าถึงไดรฟ์ C: ของผู้ใช้โดยตรง ดังนั้นสิ่งที่ดีที่สุดที่คุณทำได้คือใช้รหัสเหมือนของฉันเพื่อเข้าถึงไฟล์ที่ใดที่หนึ่งบนไดรฟ์เครือข่าย
<input type=file>
เพื่อเข้าถึงแหล่งข้อมูลในท้องถิ่น