44

Tôi có biểu mẫu HTML (upload.htm) với một điều khiển tải lên tệp HTML bên trong.truy cập bị từ chối lỗi trên IE8

<form id="frmupload" name="upload" enctype="multipart/form-data" action="uploadhandler.ashx" method="post"> 
    <input id="uploader" name="uploadctrl" type="file"/> 
</form> 

Ngoài ra còn có một phương thức JavaScript trong trang trên mà đi như thế:

function performUpload(){ 
    document.getElementById('frmupload').submit(); 
} 

tôi gọi bên này của một trang (uploadpage.htm) từ bên trong một iframe:

<iframe id="docframe" src="upload.htm" style="display:none"></iframe> 

Tôi cố gắng thực hiện tuyên bố được hiển thị bên dưới từ uploadpage.htm Trang:

var i = document.getElementById('docframe'); 
i.contentWindow.performUpload(); 

tôi nhận được một lỗi nói Truy cập bị từ chối, và gỡ lỗi của tôi dừng ở hàm JavaScript đầu tiên tôi đã thể hiện. Cả hai tệp đều nằm trong cùng một vị trí trong dự án web. Họ cũng có cùng tên miền. Tại sao tôi nhận được lỗi này?

Tất nhiên, trước đó, tôi có thể đăng trang: khi tôi không đặt thuộc tính name cho điều khiển tải lên HTML. Nhưng sau khi tôi đặt thuộc tính name trong đánh dấu HTML, tôi nhận được lỗi lạ này. Tại sao tôi không nhận được điều này lần đầu tiên?

Đã xem @ bài đăng này ->"Access is denied" when script tries to access iframe in IE8, nhưng nó không giúp ích gì.

Trả lời

97

IE không cho phép thao tác với phần tử đầu vào type = "file" từ javascript vì lý do bảo mật. Đặt tên tệp hoặc gọi một sự kiện nhấp chuột để hiển thị hộp thoại trình duyệt sẽ dẫn đến lỗi "Truy cập bị từ chối" trên biểu mẫu gửi - Internet Explorer rất thông minh về việc ghi nhớ các phương thức đã được gọi.

tương tự phát hành: http://www.webdeveloper.com/forum/showthread.php?t=181272

+3

Phải xác nhận lại câu trả lời này. Tôi đã điên cuồng tìm kiếm một vấn đề với hình thức tải lên của tôi, trong thực tế, tôi đã sử dụng đầu vào tập tin tùy chỉnh trong IE và điều này đã gây ra sự truy cập bị từ chối vấn đề. Cái nhìn sâu sắc, thx –

+0

Tôi đang thiếu gì? Fiddle này dường như chứng minh câu trả lời này sai; bằng cách sử dụng Ender/Bean thay vì jQuery Tôi đã có IE9 mở bộ chọn tệp và gửi biểu mẫu tới iframe được tạo thông qua JS và nó dường như hoạt động: http://jsfiddle.net/NkycS/27/ – RwwL

+5

Aha, tôi nhận nó - đầu vào tệp của tôi không có thuộc tính tên trên đó. Ngay sau khi tôi thêm một, tôi nhận được lỗi truy cập bị từ chối: http://jsfiddle.net/NkycS/32/ – RwwL

0

Trong cả hai tệp HTML - tệp nằm trong khung và một tệp khác chứa khung - hãy thử thêm document.domain='example.com' trong đó 'example.com' là tên miền của bạn.

+0

Đã không hoạt động. – Oxon

13

Theo truyền thống, truy cập hoạt Javascript để HTML input type="file" bị hạn chế nghiêm trọng cho vấn đề an ninh. AFAIK, Bạn không thể thực hiện các thao tác sau với JS trên phần tử trình tải lên tệp:

  1. Bạn không thể đọc "giá trị" của phần tử khi giữ tên tệp.
  2. Bạn không thể kích hoạt menu chọn tệp qua JS.
  3. Bạn không thể kích hoạt trình kiểm soát trình tải lên tệp qua JS.

Tất cả điều này được đặt ra để ngăn chặn các cuộc tấn công nguy hiểm như ăn cắp tệp của bạn dưới nền thông qua JS. Tôi đã không chơi với một yếu tố input type="file" trong một thời gian nhưng tôi đoán tốt nhất là bạn sẽ nhấn các vấn đề tương tự (nếu không phải tất cả) trong các trình duyệt khác là tốt.

Đặt cược tốt nhất của bạn là giải pháp dựa trên Flash hoặc có thể một số điều khiển HTML5 mới.

Ngoài ra, đây là một tài liệu tham khảo chính thức về vấn đề:

http://msdn.microsoft.com/en-us/library/ms535263(v=vs.85).aspx

Kiểm tra "Cộng đồng Nội dung" tất cả các cách trên dưới cùng của trang ở trên.