2009-05-28 26 views
16

Để cụ thể hơn, tôi muốn sử dụng biểu mẫu có một hoặc nhiều trường nhập tệp được sử dụng cho hình ảnh. Khi các trường đó được thay đổi, tôi muốn hiển thị bản xem trước của hình ảnh được liên kết, trước khi gửi dữ liệu đến máy chủ.có thể xem trước hình ảnh cục bộ trước khi tải chúng lên thông qua biểu mẫu không?

Tôi đã thử một số phương pháp javascript, nhưng tôi luôn chạy vào các lỗi bảo mật. Tôi sẽ không bận tâm khi sử dụng java hoặc flash, miễn là giải pháp giảm xuống một cách duyên dáng đối với những người dùng không có chúng. (Họ sẽ không nhận được bản xem trước, và họ sẽ không nhận được một 'khó chịu' cài đặt này 'hoặc.)

Có ai thực hiện điều này một cách đơn giản, có thể tái sử dụng?

P.S. Tôi biết có một hộp cát, nhưng hộp cát phải ở trong một căn phòng tối, bị khóa với tất cả các cửa sổ bị bôi đen?

+0

Bạn không thể xem trước hình ảnh của bạn mà không cần tải lên trước đó. Tôi không biết nó có thể được thực hiện với Flash, có lẽ với Java, nhưng tôi nghĩ rằng điều này sẽ giống như tryig để giết một con ruồi với một cái búa. Bạn có thể thực hiện một số tải lên "mô phỏng Ajax" với iframe, có một vài ví dụ trên mạng và chúng hoạt động khá tốt. –

+0

có thể trùng lặp của [Có cách nào để cho phép người dùng xem hình ảnh mà họ sắp tải lên phía máy khách trước khi tải lên máy chủ không?] (Http://stackoverflow.com/questions/3515965/is-there-a-way -to-let-a-user-view-an-hình ảnh-họ-đang-về-để-tải-khách-bên-b) –

+0

Kiểm tra cách tiếp cận JavaScript thuần túy này, bao gồm câu trả lời của nó và có nhận xét của Ray Nicholus cho giải pháp cuối cùng: http://stackoverflow.com/questions/16430016/using-readasdataurl-for-image-preview –

Trả lời

0

Here's a jQuery + PHP script để tải lên hình ảnh xem trước hình ảnh đó.

+0

hình ảnh này tải lên hình ảnh trước khi hiển thị hình ảnh đó. mã gọn gàng, mặc dù – Javier

-1

JavaScript không có quyền truy cập vào hệ thống tệp cục bộ vì mục đích bảo mật, thời gian.

+0

Đó là sự ngu ngốc bảo mật. Không thể gửi tệp như vậy đến máy chủ, vì vậy, điều này là gì? Tôi đã thấy nhiều trò chơi trên web có khả năng tải đồ họa lên hdd của bạn, vì vậy trò chơi hoạt động nhanh hơn. – Thinker

+0

Nhà tư tưởng, thường được thực hiện với bộ đệm ẩn HTTP - đó là một điều hoàn toàn khác. JS vẫn không có quyền truy cập vào đường dẫn trên hệ thống tệp khách hàng. –

+1

Ngoại trừ việc bây giờ có API tệp HTML5 mà cung cấp cho bạn quyền truy cập đọc vào các tệp đang được tải lên. Và nó an toàn –

1

Bước đầu tiên là tìm ra đường dẫn hình ảnh. JavaScript được phép thẩm tra điều khiển tải lên cho tên tệp/đường dẫn, nhưng (vì lý do bảo mật), các trình duyệt khác nhau hiển thị những thứ khác nhau cho JS engine so với hiển thị cho người dùng - chúng có xu hướng giữ nguyên tên tệp để bạn ít nhất có thể xác thực phần mở rộng của nó, nhưng bạn có thể nhận được c:\fake_path\ hoặc một số điều tương tự bị xáo trộn được thêm vào tên tệp. Việc thử điều này trên các trình duyệt khác nhau sẽ cho bạn ý tưởng về những gì được trả lại dưới dạng đường dẫn thực sự và những gì được giả mạo và ở đâu.

Bước thứ hai là hiển thị hình ảnh. Có thể hiển thị hình ảnh cục bộ nếu bạn biết đường dẫn của chúng, qua các thẻ img với file:// URL nguồn, nếu trình duyệt của người dùng cho phép sơ đồ file://. (Firefox không, theo mặc định.) Vì vậy, nếu bạn có thể yêu cầu người dùng cho bạn biết đường dẫn đầy đủ của hình ảnh là gì, bạn ít nhất có thể thử tải nó.

+0

+1 thử nghiệm & nó hoạt động MSIE6,7 – zeroin23

0

Tôi chỉ từng thấy các applet Java thực hiện việc này, ví dụ, applet tải lên hình ảnh trên Facebook. Nhược điểm của phương pháp Java là người dùng sẽ được nhắc tin tưởng applet trước khi nó chạy, đây là một loại phiền toái, nhưng điều này cho phép applet trình bày một trình duyệt tập tin với xem trước hình ảnh hoặc làm những điều thú vị hơn như cho phép người dùng để tải lên toàn bộ thư mục.

25

Không cần công cụ lạ mắt. Tất cả những gì bạn cần là chức năng createObjectURL, tạo URL có thể được sử dụng làm hình ảnh src và có thể xuất phát trực tiếp từ tệp cục bộ.

Giả sử bạn đã chọn một vài hình ảnh từ máy tính của người dùng bằng phần tử nhập tệp (<input type="file" />). Dưới đây là cách bạn tạo bản xem trước cho các tệp hình ảnh cho nó:

function createObjectURL(object) { 
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object); 
} 

function revokeObjectURL(url) { 
    return (window.URL) ? window.URL.revokeObjectURL(url) : window.webkitURL.revokeObjectURL(url); 
} 

function myUploadOnChangeFunction() { 
    if(this.files.length) { 
     for(var i in this.files) { 
      var src = createObjectURL(this.files[i]); 
      var image = new Image(); 
      image.src = src; 
      // Do whatever you want with your image, it's just like any other image 
      // but it displays directly from the user machine, not the server! 
     } 
    } 
} 
+0

Nó hoạt động, nhưng chỉ trong Chrome 18, Chromium 18, Firefox 11. Không hoạt động trong Safari, IE 9 và tôi đã không kiểm tra trong opera. http://jsfiddle.net/M3kj6/1/ Tôi sẽ làm việc trên nó sau để xem tôi có thể làm cho nó hoạt động an toàn hay không. Dù sao thì thú vị ... :) –

+1

Đây là cách thích hợp nhất cho nhiệm vụ đó. Theo đó: https://developer.mozilla.org/en-US/docs/DOM/window.URL.createObjectURL nó đã hoạt động trong IE 10 và Opera. –

+0

Câu trả lời tuyệt vời, cảm ơn bạn. – whitelionV

0

Bạn có thể thử phương pháp này, mặc dù có vẻ như nó không hoạt động trên IE.

http://saravani.wordpress.com/2012/03/14/preview-of-an-image-before-it-is-uploaded/

Thật đơn giản và nhanh chóng để viết mã.

tôi đặt mã ở đây chỉ trong trường hợp nguồn chết:

Script:

<!-- Assume jQuery is loaded --> 
    <script> 
     function readURL(input) { 
     if (input.files && input.files[0]) { 
      var reader = new FileReader(); 

      reader.onload = function (e) { 
      $('#img_prev') 
       .attr('src', e.target.result) 
       .width(150) 
       .height(200); 
      }; 

      reader.readAsDataURL(input.files[0]); 
     } 
     } 
    </script> 

Trong HTML:

<!--[if IE]> 
     <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
    </head> 
    <body> 
     <input type='file' onchange="readURL(this);" /> 
     <img id="img_prev" src="#" alt="your image" /> 
    </body> 
Các vấn đề liên quan