2009-05-28 15 views
16

Daha spesifik olmak gerekirse, resimler için kullanılan bir veya daha fazla dosya giriş alanı olan bir form kullanmak istiyorum. Bu alanlar değiştirildiğinde, verileri sunucuya göndermeden önce ilişkili görüntünün bir önizlemesini göstermek istiyorum.Yerel görüntüleri, bir form aracılığıyla yüklemeden önce önizlemek mümkün mü?

Birçok javascript yaklaşımı denedim, ancak her zaman güvenlik hatalarıyla karşılaşıyorum. Elimde olmayan kullanıcılar için çözümün hassas bir şekilde düştüğü sürece, java veya flaş kullanmayı düşünmüyorum. (Önizlemeyi alamazlardı ve rahatsız edici bir şey bulamazlardı 'bu şeyi yükle')

Bunu basit, yeniden kullanılabilir bir şekilde yaptı mı?

P.S. Kum havuzunun olduğunu biliyorum, ama sandbox karartılmış tüm pencereleri olan karanlık, kilitli bir odada mı olmalı? Bir görüntüyü önizlemek için önizleme yapmak üzere

+0

Daha önce yükleyerek olmadan görüntüyü önizleyemezsiniz. Bilmiyorum, belki de Java ile Flash ile yapılabiliyor, ama sanırım bu bir çekiçle bir sinek öldürmeyi deneyebilir. Iframe'lerle bazı "Ajax simulated" yüklemeleri yapabilir, nette birkaç örnek vardır ve oldukça iyi çalışırlar. –

+0

olası bir kopyası [Bir kullanıcının sunucuya yüklemeden önce istemci tarafını yüklemek üzere oldukları bir görüntüyü görmesine izin vermenin bir yolu var mı?] (Http://stackoverflow.com/questions/3515965/is-there-a-way -to-let-a-kullanıcı-görmek-bir-görüntü-onlar-hakkında-yüklemek-istemci-tarafı-b) –

+0

Onun cevabı ve Ray Nicholus 'için yorum da dahil olmak üzere, bu saf JavaScript yaklaşımı göz atın son çözüm: http://stackoverflow.com/questions/16430016/using-readasdataurl-for-image-preview –

cevap

-1

JavaScript'in güvenlik nedeniyle, yerel dosya sistemine erişimi yoktur.

+0

Bu güvenlik sıkıntısı. Bu dosya sunucuya gönderilemiyor, bu ne için? Hdd'nize grafik indirme olanağı sunan birçok web oyununu gördüm, bu yüzden oyun daha hızlı çalışıyor. – Thinker

+0

Düşünür, bu genellikle HTTP önbelleklemesi ile gerçekleştirilir - bu tamamen farklı bir şeydir. JS, istemci dosya sistemindeki yollara hala erişemez. –

+1

Bunun dışında, yüklenen dosyalara okuma erişimi vermenizi sağlayan bir HTML5 Dosya API'si var. Ve güvenli –

1

İlk adım görüntü yolunu bulmaktır. JavaScript'in bir dosya adı/yol için yükleme denetimini sorgulamasına izin verilir, ancak (güvenlik nedeniyle) çeşitli tarayıcılar, JS motoruna kullanıcıya gösterdiklerinden farklı şeyler gösterirler - dosya adını sağlam tutmaya eğilimli olurlar, böylece en azından doğrulama yapabilirler onun uzantısı, ancak c:\fake_path\ veya dosya adına eklenmiş benzer şekilde gizlenmiş bir şey alabilirsiniz. Bunu çeşitli tarayıcılarda denemek, gerçek bir yol olarak neyin döndüğünü ve neyin sahte olduğunu ve neyin nerede olduğu hakkında bir fikir verecektir.

İkinci adım görüntüyü görüntülüyor. Kullanıcı tarayıcısı file:// şemasına izin veriyorsa, yollarını biliyorsanız, img etiketleriyle file:// kaynak URL'leri aracılığıyla yerel görüntüleri görüntülemek mümkündür. (Firefox varsayılan olarak yoktur.) Böylece, kullanıcıya görüntünün tam yolunun ne olduğunu söylemesini sağlayabilirsiniz, en azından yüklemeyi deneyebilirsiniz.

+0

+1 test edilmiş ve çalışır MSIE6,7 – zeroin23

0

Sadece bunu gerçekleştiren Java uygulamalarını gördüm, örneğin, Facebook'ta görüntü yükleme uygulaması. Java yaklaşımının dezavantajı, kullanıcının çalıştırılmadan önce uygulamaya başlamasının istenmesidir, bu bir çeşit rahatsızlıktır, ancak bu uygulama, uygulama önizlemeleri içeren bir dosya tarayıcısı sunma veya kullanıcıya izin veren daha ilginç şeyler yapma olanağını sağlar. dizinin tamamını yüklemek için

25

Süslü şeylere gerek yok. Tek ihtiyacınız olan görüntü src olarak kullanılabilecek bir URL oluşturan ve yerel bir dosyadan doğrudan gelebilen createObjectURL işlevidir.

Kullanıcının bilgisayarından bir dosya giriş öğesi (<input type="file" />) kullanarak birkaç görüntü seçtiğinizi varsayalım. İşte bunun için resim dosyaları için önizleme oluşturmak gibi olacaktır:

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

Sadece Chrome 18, Chromium 18, Firefox 11'de çalışır. Safari'de çalışmıyor, IE 9 ve operada kontrol edilmedi. http://jsfiddle.net/M3kj6/1/ Daha sonra çalışıp çalışmadığımı görmek için üzerinde çalışacağım. Her neyse onun ilginç ... :) –

+1

Bu görev için en uygun yol bu. Buna göre: https://developer.mozilla.org/en-US/docs/DOM/window.URL.createObjectURL zaten IE 10 ve Opera'da çalışıyor. –

+0

Mükemmel cevap, teşekkürler. – whitelionV

0

Bu yaklaşım deneyebilirsiniz, o IE üzerinde çalışmıyor görünse de.

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

Kodun basit ve hızlı.

ben kaynak ölür ihtimale kodu buraya koyun:

Senaryo: HTML'de

<!-- 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> 

:

<!--[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> 
İlgili konular