Dosya girdisinin seçili dosya adını yol olmadan almak için jQuery kullanın


154

Bunu kullandım:

$('input[type=file]').val()

dosya adını seçin, ancak "C: \ fakepath \ dosyaadı.doc" dosyasında olduğu gibi tam yolu döndürdü. "Fakepath" bölümü aslında oradaydı - olması gerekip gerekmediğinden emin değilim, ancak dosya yüklemelerinin dosya adı ile ilk defa çalışıyorum.

Dosya adını nasıl alabilirim (dosyaadı.doc)?


11
Tarayıcı gerçek yolu değiştirir, C:\fakepath\ böylece kötü amaçlı siteler bilgisayarınızın dizin yapısı hakkında bilgi edinmek için javascript kullanamaz.
köle

Yanıtlar:


295
var filename = $('input[type=file]').val().split('\\').pop();

ya da sadece yapabilirsiniz (çünkü her zaman C:\fakepathgüvenlik nedeniyle eklenir):

var filename = $('input[type=file]').val().replace(/C:\\fakepath\\/i, '')

1
Tam olarak ihtiyacım olan şey, manji! Ben de uzantısını kontrol etmek gerekiyor, bu yüzden örnek bu şekilde kullanılır: var extension = filename.split ('.'). Pop (); bunu elde etmek için! Teşekkürler!
marky

Büyük Fakepathbir F ile mi?
alex

16
@MikeDeSimone Split ('\\') test ettik. Pop (); Win 7, Ubuntu 11.04 ve Mac OS X'te çalışıyor ve hepsinde iyi çalışıyor.
Alex

3
@Alex: Vay canına, bu oldukça çılgın. Yani gerçekten sadece birinin asla sabit olmayacak kötü JS kodu için bir çözüm. Mac'te Safari çalıştırıyorum ve orada "C: \ fakepath \" görüyorum. ( Onunla jsfiddle'da oyna .)
Mike DeSimone

1
@ VítorBaptista Windows dosyalarının adlarında ters eğik çizgiler olamaz. Bu her ne kadar MacOS imkanı "Bazı işletim sistemleri ve tahrik biçimleri dizin ayracı olarak bu karakterleri kullanmak çünkü dosya ve klasörlerin isimlerinde iki nokta üst üste ve eğik çizgi kullanmaktan kaçınmalısınız" de açıklandığı gibi Apple'ın web sitesinden
joao.arruda

68

Aşağıdaki kodu yapmanız yeterlidir. İlk [0] HTML öğesine ve ikinci [0] dosya yüklemesinin ilk dosyasına erişmektir (dosya olmaması durumunda bir doğrulama ekledim):

    var filename = $('input[type=file]')[0].files.length ? ('input[type=file]')[0].files[0].name : "";

1
Bu seçeneği kullanırken göz önünde bulundurulması gereken bir şey vardır: Açık dosya penceresini açmak için 'Dosya seç' düğmesine tekrar tıkladığınızda, ardından kaçış düğmesine tıkladığınızda bir konsol hatası atılır.
luke_mclachlan

Evet, haklısınız, ancak amaç adı almak için sadece kodu koymaktı çünkü kod adı sabit kodlu bir konumdan aldıkça, bir dosya olup olmadığını kontrol etmek gerekecekti (bu durumda konuşuyoruz yalnızca bir dosya olabilir, ancak daha fazlasına sahip olabilir ve kodun tüm öğeler tarafından tekrarlanması gerekir). Ama eminim, kodu güncelleyeceğim ve bu doğrulamayı ekleyeceğim.
Diego Cotini

23

Chrome C:\fakepath\...güvenlik nedeniyle geri döner - bir web sitesi, bilgisayarınızdaki bir dosya yolu gibi bilgisayarınız hakkında bilgi alamamalıdır.

Bir dizenin sadece dosya adı bölümünü almak için şunu kullanabilirsiniz split()...

var file = path.split('\\').pop();

jsFiddle .

... ya da düzenli bir ifade ...

var file = path.match(/\\([^\\]+)$/)[1];

jsFiddle .

... ya da lastIndexOf()...

var file = path.substr(path.lastIndexOf('\\') + 1);

jsFiddle .


21

Tüm işletim sistemlerinde yol çalışması alın

var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');

Misal

C:\fakepath\filename.doc 
/var/fakepath/filename.doc

Her ikisi de geri dönüyor

filename.doc
filename.doc

Örnek kod var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');jQuery kullanıyor.
Zarepheth

13

İşte nasıl yaptığım, oldukça iyi çalışıyor.

HTML'nizde şunları yapın:

<input type="file" name="Att_AttributeID" onchange="fileSelect(event)" class="inputField" />

Sonra js dosyanızda basit bir işlev oluşturun:

function fileSelect(id, e){
    console.log(e.target.files[0].name);
}

Birden fazla dosya yapıyorsanız, bunun üzerinde döngü yaparak listeyi de alabilmeniz gerekir:

e.target.files[0].name

Alan kimliği bu bağlamda hiçbir şey yapmadığından, JS'deki işlevin 1 parametresi daha az olmalıdır, sadece fileSelect (id, e) yerine sadece fileSelect (e) yerine e. Çözüm için teşekkürler :).
Jasper Lankhorst

8

belki fakepath önlemek için bazı ek:

var fileName = $('input[type=file]').val();
var clean=fileName.split('\\').pop(); // clean from C:\fakepath OR C:\fake_path 
alert('clean file name : '+ fileName);

5

Böyle bir şeye ne dersin?

var pathArray = $('input[type=file]').val().split('\\');
alert(pathArray[pathArray.length - 1]);

4

Jquery olmalı mı? Ya da yourpath.split("\\")dizeyi bir diziye bölmek için JavaScript'in doğal özelliğini kullanabilir misiniz ?


3

İlk dosyayı denetimden alın ve ardından dosyanın adını alın, Chrome'daki dosya yolunu yok sayar ve IE tarayıcıları için yol düzeltmesi yapar. Dosyayı kaydederken, dosya System.io.Path.GetFileNameadını yalnızca IE tarayıcıları için almak için yöntem kullanmanız gerekir

var fileUpload    = $("#ContentPlaceHolder1_FileUpload_mediaFile").get(0); 
var files         =  fileUpload.files; 
var mediafilename = ""; 

for (var i = 0; i < files.length; i++) { 
  mediafilename = files[i].name; 
} 

2
<script type="text/javascript">

    $('#upload').on('change',function(){
       // output raw value of file input
       $('#filename').html($(this).val().replace(/.*(\/|\\)/, '')); 

        // or, manipulate it further with regex etc.
        var filename = $(this).val().replace(/.*(\/|\\)/, '');
        // .. do your magic

        $('#filename').html(filename);
    });
</script>

1
var filename=location.href.substr(location.href.lastIndexOf("/")+1);
alert(filename);

1

Bu alternatif en uygun gibi görünüyor.

$('input[type="file"]').change(function(e){
        var fileName = e.target.files[0].name;
        alert('The file "' + fileName +  '" has been selected.');
});

0

Burada şöyle diyebilirsiniz. Bu benim Giriş Dosyasım olsun

  <input type="file" title="search image" id="file" name="file" onchange="show(this)"  />

Şimdi dosyayı seçtiğinizde çağrılan Jquery'm

<script type="text/javascript">
    function show(input) {
        var fileName = input.files[0].name;
        alert('The file "' + fileName + '" has been selected.');               
            }

</script>

0

Bunu kullanarak da kaldırabiliriz match

var fileName = $('input:file').val().match(/[^\\/]*$/)[0];
$('#file-name').val(fileName);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.